@carto/kepler.gl 0.0.74 → 0.0.75-alpha.deckv9.1

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 (416) hide show
  1. package/dist/actions/action-wrapper.js +20 -48
  2. package/dist/actions/actions.js +10 -19
  3. package/dist/actions/identity-actions.js +8 -17
  4. package/dist/actions/index.js +7 -24
  5. package/dist/actions/map-state-actions.js +10 -19
  6. package/dist/actions/map-style-actions.js +20 -35
  7. package/dist/actions/provider-actions.js +26 -42
  8. package/dist/actions/ui-state-actions.js +42 -70
  9. package/dist/actions/vis-state-actions.js +102 -162
  10. package/dist/cloud-providers/index.js +8 -8
  11. package/dist/cloud-providers/provider.js +55 -94
  12. package/dist/components/bottom-widget.js +47 -48
  13. package/dist/components/common/action-panel.js +39 -38
  14. package/dist/components/common/animation-control/animation-control.js +40 -38
  15. package/dist/components/common/animation-control/animation-controller.js +47 -70
  16. package/dist/components/common/animation-control/animation-speed-slider.js +28 -38
  17. package/dist/components/common/animation-control/floating-time-display.js +56 -67
  18. package/dist/components/common/animation-control/playback-controls.js +64 -80
  19. package/dist/components/common/animation-control/speed-control.js +26 -24
  20. package/dist/components/common/checkbox.js +31 -52
  21. package/dist/components/common/color-legend.js +40 -72
  22. package/dist/components/common/data-table/button.js +29 -22
  23. package/dist/components/common/data-table/canvas.js +21 -10
  24. package/dist/components/common/data-table/cell-size.js +54 -58
  25. package/dist/components/common/data-table/grid.js +30 -31
  26. package/dist/components/common/data-table/index.js +91 -133
  27. package/dist/components/common/data-table/option-dropdown.js +29 -33
  28. package/dist/components/common/dataset-label.js +21 -13
  29. package/dist/components/common/error-boundary.js +25 -30
  30. package/dist/components/common/field-selector.js +35 -69
  31. package/dist/components/common/field-token.js +21 -16
  32. package/dist/components/common/file-uploader/file-drop.js +40 -55
  33. package/dist/components/common/file-uploader/file-upload-progress.js +32 -30
  34. package/dist/components/common/file-uploader/file-upload.js +52 -91
  35. package/dist/components/common/file-uploader/upload-button.js +31 -42
  36. package/dist/components/common/histogram-plot.js +32 -27
  37. package/dist/components/common/icons/add.js +27 -27
  38. package/dist/components/common/icons/anchor_window.js +3 -9
  39. package/dist/components/common/icons/arrow-down-alt.js +27 -27
  40. package/dist/components/common/icons/arrow-down-solid .js +27 -27
  41. package/dist/components/common/icons/arrow-down.js +27 -27
  42. package/dist/components/common/icons/arrow-left.js +27 -27
  43. package/dist/components/common/icons/arrow-right.js +27 -27
  44. package/dist/components/common/icons/arrow-up-alt.js +27 -27
  45. package/dist/components/common/icons/arrow-up-solid.js +27 -27
  46. package/dist/components/common/icons/arrow-up.js +27 -27
  47. package/dist/components/common/icons/base.js +38 -42
  48. package/dist/components/common/icons/bug.js +27 -27
  49. package/dist/components/common/icons/cancel.js +27 -27
  50. package/dist/components/common/icons/checkmark.js +27 -28
  51. package/dist/components/common/icons/chevron-right.js +27 -27
  52. package/dist/components/common/icons/clipboard.js +27 -27
  53. package/dist/components/common/icons/clock.js +27 -27
  54. package/dist/components/common/icons/close.js +27 -27
  55. package/dist/components/common/icons/code-alt.js +27 -28
  56. package/dist/components/common/icons/copy.js +27 -28
  57. package/dist/components/common/icons/crosshairs.js +27 -28
  58. package/dist/components/common/icons/cube-3d.js +27 -27
  59. package/dist/components/common/icons/cursor-click.js +27 -27
  60. package/dist/components/common/icons/data-table.js +27 -27
  61. package/dist/components/common/icons/db.js +27 -27
  62. package/dist/components/common/icons/delete.js +27 -27
  63. package/dist/components/common/icons/docs.js +27 -27
  64. package/dist/components/common/icons/drag-n-drop.js +27 -27
  65. package/dist/components/common/icons/draw-polygon.js +27 -27
  66. package/dist/components/common/icons/email.js +27 -27
  67. package/dist/components/common/icons/expand.js +27 -27
  68. package/dist/components/common/icons/eye-seen.js +27 -27
  69. package/dist/components/common/icons/eye-unseen.js +27 -27
  70. package/dist/components/common/icons/file-type.js +23 -16
  71. package/dist/components/common/icons/file.js +27 -27
  72. package/dist/components/common/icons/files.js +24 -26
  73. package/dist/components/common/icons/filter-funnel.js +27 -27
  74. package/dist/components/common/icons/free-window.js +3 -9
  75. package/dist/components/common/icons/gear.js +27 -27
  76. package/dist/components/common/icons/hash.js +27 -27
  77. package/dist/components/common/icons/histogram.js +24 -25
  78. package/dist/components/common/icons/index.js +63 -138
  79. package/dist/components/common/icons/info.js +27 -28
  80. package/dist/components/common/icons/layers.js +27 -27
  81. package/dist/components/common/icons/left-arrow.js +27 -28
  82. package/dist/components/common/icons/legend.js +27 -27
  83. package/dist/components/common/icons/line-chart.js +27 -27
  84. package/dist/components/common/icons/login.js +27 -27
  85. package/dist/components/common/icons/logout.js +27 -27
  86. package/dist/components/common/icons/map-icon.js +27 -28
  87. package/dist/components/common/icons/map.js +27 -28
  88. package/dist/components/common/icons/messages.js +27 -27
  89. package/dist/components/common/icons/minus.js +27 -27
  90. package/dist/components/common/icons/pause.js +27 -27
  91. package/dist/components/common/icons/picture.js +24 -26
  92. package/dist/components/common/icons/pin.js +27 -27
  93. package/dist/components/common/icons/play.js +27 -27
  94. package/dist/components/common/icons/polygon.js +27 -27
  95. package/dist/components/common/icons/rectangle.js +27 -27
  96. package/dist/components/common/icons/reduce.js +27 -27
  97. package/dist/components/common/icons/reset.js +27 -27
  98. package/dist/components/common/icons/rocket.js +27 -27
  99. package/dist/components/common/icons/save.js +27 -27
  100. package/dist/components/common/icons/save2.js +27 -27
  101. package/dist/components/common/icons/search.js +27 -27
  102. package/dist/components/common/icons/settings.js +27 -27
  103. package/dist/components/common/icons/share.js +27 -27
  104. package/dist/components/common/icons/split.js +27 -27
  105. package/dist/components/common/icons/square-select.js +27 -27
  106. package/dist/components/common/icons/swap-horizontal.js +27 -28
  107. package/dist/components/common/icons/table.js +27 -27
  108. package/dist/components/common/icons/trash.js +27 -27
  109. package/dist/components/common/icons/upload.js +27 -27
  110. package/dist/components/common/icons/vert-dots.js +27 -27
  111. package/dist/components/common/icons/vert-three-dots.js +27 -27
  112. package/dist/components/common/icons/warning.js +27 -28
  113. package/dist/components/common/image-preview.js +36 -29
  114. package/dist/components/common/info-helper.js +26 -25
  115. package/dist/components/common/item-selector/accessor.js +3 -5
  116. package/dist/components/common/item-selector/chickleted-input.js +41 -43
  117. package/dist/components/common/item-selector/dropdown-list.js +44 -74
  118. package/dist/components/common/item-selector/item-selector-submenu.js +29 -38
  119. package/dist/components/common/item-selector/item-selector.js +36 -84
  120. package/dist/components/common/item-selector/typeahead.js +37 -83
  121. package/dist/components/common/line-chart.js +39 -36
  122. package/dist/components/common/loading-spinner.js +33 -25
  123. package/dist/components/common/logo.js +24 -22
  124. package/dist/components/common/map-layer-selector.js +23 -16
  125. package/dist/components/common/modal.js +36 -61
  126. package/dist/components/common/portaled.js +56 -97
  127. package/dist/components/common/progress-bar.js +29 -20
  128. package/dist/components/common/range-brush.js +63 -104
  129. package/dist/components/common/range-plot.js +47 -52
  130. package/dist/components/common/range-slider.js +52 -78
  131. package/dist/components/common/slider/mouse-event.js +11 -37
  132. package/dist/components/common/slider/slider-bar-handle.js +31 -39
  133. package/dist/components/common/slider/slider-handle.js +35 -44
  134. package/dist/components/common/slider/slider.js +55 -82
  135. package/dist/components/common/styled-components.js +64 -169
  136. package/dist/components/common/switch.js +22 -16
  137. package/dist/components/common/time-range-slider-time-title.js +24 -19
  138. package/dist/components/common/time-range-slider.js +41 -38
  139. package/dist/components/common/time-slider-marker.js +36 -41
  140. package/dist/components/common/toolbar-item.js +22 -16
  141. package/dist/components/common/toolbar.js +21 -10
  142. package/dist/components/common/vertical-toolbar.js +21 -10
  143. package/dist/components/container.js +49 -70
  144. package/dist/components/context.js +6 -10
  145. package/dist/components/editor/constants.js +6 -8
  146. package/dist/components/editor/editor.js +40 -72
  147. package/dist/components/editor/feature-action-panel.js +35 -43
  148. package/dist/components/editor/feature-styles.js +35 -40
  149. package/dist/components/editor/handle-style.js +35 -37
  150. package/dist/components/filters/components.js +21 -10
  151. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +14 -25
  152. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +14 -21
  153. package/dist/components/filters/filter-panels/new-filter-panel.js +13 -23
  154. package/dist/components/filters/filter-panels/polygon-filter-panel.js +13 -25
  155. package/dist/components/filters/filter-panels/range-filter-panel.js +14 -21
  156. package/dist/components/filters/filter-panels/single-select-filter-panel.js +14 -21
  157. package/dist/components/filters/filter-panels/time-range-filter-panel.js +14 -23
  158. package/dist/components/filters/index.js +11 -17
  159. package/dist/components/filters/multi-select-filter.js +3 -9
  160. package/dist/components/filters/polygon-filter.js +8 -18
  161. package/dist/components/filters/range-filter.js +3 -8
  162. package/dist/components/filters/single-select-filter.js +3 -9
  163. package/dist/components/filters/time-range-filter.js +7 -18
  164. package/dist/components/filters/time-widget.js +41 -51
  165. package/dist/components/geocoder/geocoder.js +95 -128
  166. package/dist/components/geocoder-panel.js +37 -62
  167. package/dist/components/index.js +356 -498
  168. package/dist/components/injector.js +42 -58
  169. package/dist/components/kepler-gl.js +65 -158
  170. package/dist/components/map/coordinate-info.js +4 -13
  171. package/dist/components/map/layer-hover-info.js +40 -48
  172. package/dist/components/map/layer-selector-panel.js +17 -30
  173. package/dist/components/map/locale-panel.js +13 -27
  174. package/dist/components/map/map-control-panel.js +27 -24
  175. package/dist/components/map/map-control-toolbar.js +21 -11
  176. package/dist/components/map/map-control-tooltip.js +4 -11
  177. package/dist/components/map/map-control.js +26 -27
  178. package/dist/components/map/map-draw-panel.js +12 -29
  179. package/dist/components/map/map-legend-panel.js +17 -34
  180. package/dist/components/map/map-legend.js +52 -70
  181. package/dist/components/map/map-popover.js +41 -57
  182. package/dist/components/map/split-map-button.js +13 -25
  183. package/dist/components/map/toggle-3d-button.js +10 -21
  184. package/dist/components/map-container.js +98 -145
  185. package/dist/components/maps-layout.js +24 -26
  186. package/dist/components/modal-container.js +60 -112
  187. package/dist/components/modals/add-map-style-modal.js +37 -67
  188. package/dist/components/modals/cloud-tile.js +36 -36
  189. package/dist/components/modals/data-table-modal.js +51 -81
  190. package/dist/components/modals/delete-data-modal.js +24 -20
  191. package/dist/components/modals/error-display.js +3 -10
  192. package/dist/components/modals/export-data-modal.js +37 -54
  193. package/dist/components/modals/export-image-modal.js +31 -28
  194. package/dist/components/modals/export-map-modal/components.js +27 -27
  195. package/dist/components/modals/export-map-modal/export-html-map.js +27 -27
  196. package/dist/components/modals/export-map-modal/export-json-map.js +22 -22
  197. package/dist/components/modals/export-map-modal/export-map-modal.js +20 -40
  198. package/dist/components/modals/image-modal-container.js +9 -16
  199. package/dist/components/modals/load-data-modal.js +29 -33
  200. package/dist/components/modals/load-storage-map.js +42 -77
  201. package/dist/components/modals/loading-dialog.js +24 -18
  202. package/dist/components/modals/modal-dialog.js +3 -7
  203. package/dist/components/modals/modal-tabs.js +29 -29
  204. package/dist/components/modals/overwrite-map-modal.js +29 -28
  205. package/dist/components/modals/provider-modal-container.js +27 -27
  206. package/dist/components/modals/save-map-modal.js +43 -48
  207. package/dist/components/modals/share-map-modal.js +42 -53
  208. package/dist/components/modals/status-panel.js +24 -25
  209. package/dist/components/modals/storage-map-viewer.js +30 -43
  210. package/dist/components/notification-panel/notification-item.js +33 -47
  211. package/dist/components/notification-panel.js +30 -36
  212. package/dist/components/performance.js +11 -36
  213. package/dist/components/plot-container.js +42 -72
  214. package/dist/components/side-panel/cloud-storage-dropdown.js +4 -10
  215. package/dist/components/side-panel/common/dataset-info.js +20 -13
  216. package/dist/components/side-panel/common/dataset-tag.js +21 -12
  217. package/dist/components/side-panel/common/dataset-title.js +37 -52
  218. package/dist/components/side-panel/common/source-data-catalog.js +26 -22
  219. package/dist/components/side-panel/common/source-data-selector.js +34 -40
  220. package/dist/components/side-panel/custom-panel.js +5 -9
  221. package/dist/components/side-panel/filter-manager.js +18 -29
  222. package/dist/components/side-panel/filter-panel/filter-panel-header.js +30 -30
  223. package/dist/components/side-panel/filter-panel/filter-panel.js +36 -55
  224. package/dist/components/side-panel/interaction-manager.js +5 -12
  225. package/dist/components/side-panel/interaction-panel/brush-config.js +23 -19
  226. package/dist/components/side-panel/interaction-panel/interaction-panel.js +36 -59
  227. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +34 -74
  228. package/dist/components/side-panel/interaction-panel/tooltip-config.js +28 -40
  229. package/dist/components/side-panel/layer-manager.js +51 -82
  230. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +3 -10
  231. package/dist/components/side-panel/layer-panel/color-palette.js +27 -23
  232. package/dist/components/side-panel/layer-panel/color-range-selector.js +52 -98
  233. package/dist/components/side-panel/layer-panel/color-selector.js +36 -67
  234. package/dist/components/side-panel/layer-panel/column-selector.js +26 -25
  235. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +2 -6
  236. package/dist/components/side-panel/layer-panel/custom-palette.js +37 -71
  237. package/dist/components/side-panel/layer-panel/custom-picker.js +32 -45
  238. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +8 -16
  239. package/dist/components/side-panel/layer-panel/hex-column-config.js +12 -34
  240. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +2 -10
  241. package/dist/components/side-panel/layer-panel/layer-column-config.js +31 -27
  242. package/dist/components/side-panel/layer-panel/layer-config-group.js +46 -80
  243. package/dist/components/side-panel/layer-panel/layer-configurator.js +158 -249
  244. package/dist/components/side-panel/layer-panel/layer-panel-header.js +52 -66
  245. package/dist/components/side-panel/layer-panel/layer-panel.js +33 -54
  246. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +28 -22
  247. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +22 -18
  248. package/dist/components/side-panel/layer-panel/layer-type-selector.js +29 -32
  249. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +35 -40
  250. package/dist/components/side-panel/layer-panel/single-color-palette.js +32 -42
  251. package/dist/components/side-panel/layer-panel/text-label-panel.js +31 -42
  252. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +39 -52
  253. package/dist/components/side-panel/layer-panel/vis-config-slider.js +10 -19
  254. package/dist/components/side-panel/layer-panel/vis-config-switch.js +28 -29
  255. package/dist/components/side-panel/map-manager.js +32 -46
  256. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +28 -31
  257. package/dist/components/side-panel/map-style-panel/map-style-selector.js +26 -24
  258. package/dist/components/side-panel/panel-dropdown.js +28 -35
  259. package/dist/components/side-panel/panel-header-action.js +38 -43
  260. package/dist/components/side-panel/panel-header.js +54 -92
  261. package/dist/components/side-panel/panel-tab.js +24 -20
  262. package/dist/components/side-panel/panel-title.js +21 -10
  263. package/dist/components/side-panel/panel-toggle.js +26 -23
  264. package/dist/components/side-panel/side-bar.js +37 -53
  265. package/dist/components/side-panel.js +56 -65
  266. package/dist/connect/keplergl-connect.js +5 -14
  267. package/dist/connect/with-local-selector.js +33 -38
  268. package/dist/constants/action-types.js +5 -6
  269. package/dist/constants/color-palette.js +12 -23
  270. package/dist/constants/color-ranges.js +32 -31
  271. package/dist/constants/custom-color-ranges.js +9 -14
  272. package/dist/constants/default-settings.js +154 -239
  273. package/dist/constants/index.js +95 -103
  274. package/dist/constants/keyevent.js +3 -7
  275. package/dist/constants/tooltip.js +7 -10
  276. package/dist/constants/user-feedbacks.js +5 -6
  277. package/dist/constants/user-guides.js +12 -20
  278. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +29 -32
  279. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +10 -43
  280. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +54 -75
  281. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +29 -32
  282. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +29 -30
  283. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +29 -30
  284. package/dist/deckgl-layers/layer-utils/cluster-utils.js +10 -21
  285. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +75 -132
  286. package/dist/deckgl-layers/layer-utils/shader-utils.js +1 -5
  287. package/dist/deckgl-layers/line-layer/line-layer.js +27 -34
  288. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +26 -30
  289. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +33 -39
  290. package/dist/index.js +4 -23
  291. package/dist/layers/aggregation-layer.js +63 -97
  292. package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
  293. package/dist/layers/arc-layer/arc-layer.js +48 -73
  294. package/dist/layers/base-layer.js +255 -406
  295. package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
  296. package/dist/layers/cluster-layer/cluster-layer.js +33 -44
  297. package/dist/layers/default-layer-icon.js +27 -27
  298. package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
  299. package/dist/layers/geojson-layer/geojson-layer.js +54 -87
  300. package/dist/layers/geojson-layer/geojson-utils.js +35 -47
  301. package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
  302. package/dist/layers/grid-layer/grid-layer.js +30 -41
  303. package/dist/layers/grid-layer/grid-utils.js +6 -9
  304. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
  305. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +48 -80
  306. package/dist/layers/h3-hexagon-layer/h3-utils.js +10 -21
  307. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
  308. package/dist/layers/heatmap-layer/heatmap-layer.js +45 -72
  309. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
  310. package/dist/layers/hexagon-layer/hexagon-layer.js +30 -42
  311. package/dist/layers/hexagon-layer/hexagon-utils.js +3 -15
  312. package/dist/layers/icon-layer/icon-info-modal.js +23 -26
  313. package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
  314. package/dist/layers/icon-layer/icon-layer.js +59 -97
  315. package/dist/layers/index.js +38 -39
  316. package/dist/layers/layer-factory.js +38 -42
  317. package/dist/layers/layer-text-label.js +7 -17
  318. package/dist/layers/layer-update.js +3 -14
  319. package/dist/layers/line-layer/line-layer-icon.js +27 -27
  320. package/dist/layers/line-layer/line-layer.js +46 -66
  321. package/dist/layers/mapbox-utils.js +38 -51
  322. package/dist/layers/mapboxgl-layer.js +43 -58
  323. package/dist/layers/point-layer/point-layer-icon.js +27 -27
  324. package/dist/layers/point-layer/point-layer.js +57 -90
  325. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +41 -73
  326. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
  327. package/dist/layers/s2-geometry-layer/s2-utils.js +5 -11
  328. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +21 -15
  329. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
  330. package/dist/layers/scenegraph-layer/scenegraph-layer.js +52 -75
  331. package/dist/layers/trip-layer/trip-info-modal.js +21 -16
  332. package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
  333. package/dist/layers/trip-layer/trip-layer.js +51 -93
  334. package/dist/layers/trip-layer/trip-utils.js +16 -39
  335. package/dist/layers/types.js +3 -6
  336. package/dist/localization/en.js +22 -11
  337. package/dist/localization/formatted-message.js +5 -10
  338. package/dist/localization/index.js +7 -13
  339. package/dist/localization/locales.js +7 -12
  340. package/dist/middleware/index.js +2 -5
  341. package/dist/processors/data-processor.js +113 -177
  342. package/dist/processors/file-handler.js +200 -276
  343. package/dist/processors/index.js +33 -35
  344. package/dist/reducers/combined-updaters.js +35 -46
  345. package/dist/reducers/composer-helpers.js +28 -27
  346. package/dist/reducers/composers.js +25 -12
  347. package/dist/reducers/core.js +13 -46
  348. package/dist/reducers/index.js +24 -38
  349. package/dist/reducers/map-state-updaters.js +53 -65
  350. package/dist/reducers/map-state.js +31 -26
  351. package/dist/reducers/map-style-updaters.js +92 -136
  352. package/dist/reducers/map-style.js +31 -26
  353. package/dist/reducers/provider-state-updaters.js +92 -167
  354. package/dist/reducers/provider-state.js +32 -25
  355. package/dist/reducers/root.js +44 -50
  356. package/dist/reducers/ui-state-updaters.js +102 -202
  357. package/dist/reducers/ui-state.js +32 -26
  358. package/dist/reducers/vis-state-merger.js +102 -166
  359. package/dist/reducers/vis-state-selectors.js +5 -10
  360. package/dist/reducers/vis-state-updaters.js +386 -663
  361. package/dist/reducers/vis-state.js +32 -25
  362. package/dist/schemas/dataset-schema.js +36 -56
  363. package/dist/schemas/index.js +38 -45
  364. package/dist/schemas/map-state-schema.js +28 -24
  365. package/dist/schemas/map-style-schema.js +34 -48
  366. package/dist/schemas/schema-manager.js +44 -62
  367. package/dist/schemas/schema-utils.js +11 -15
  368. package/dist/schemas/schema.js +32 -27
  369. package/dist/schemas/versions.js +5 -9
  370. package/dist/schemas/vis-state-schema.js +109 -309
  371. package/dist/styles/base.js +367 -640
  372. package/dist/styles/index.js +1 -5
  373. package/dist/styles/media-breakpoints.js +21 -9
  374. package/dist/tasks/tasks.js +22 -50
  375. package/dist/templates/export-map-html.js +3 -6
  376. package/dist/utils/aggregate-utils.js +23 -27
  377. package/dist/utils/color-utils.js +36 -38
  378. package/dist/utils/custom-scales.js +1 -7
  379. package/dist/utils/data-scale-utils.js +11 -20
  380. package/dist/utils/data-utils.js +78 -137
  381. package/dist/utils/dataset-utils.js +71 -88
  382. package/dist/utils/dom-to-image.js +15 -93
  383. package/dist/utils/dom-utils.js +34 -116
  384. package/dist/utils/export-utils.js +65 -102
  385. package/dist/utils/filter-utils.js +170 -320
  386. package/dist/utils/gl-utils.js +25 -17
  387. package/dist/utils/gpu-filter-utils.js +46 -59
  388. package/dist/utils/index.js +68 -80
  389. package/dist/utils/interaction-utils.js +26 -50
  390. package/dist/utils/layer-utils.js +58 -63
  391. package/dist/utils/locale-utils.js +23 -21
  392. package/dist/utils/map-info-utils.js +2 -3
  393. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +72 -71
  394. package/dist/utils/map-style-utils/mapbox-utils.js +3 -5
  395. package/dist/utils/mapbox-utils.js +2 -5
  396. package/dist/utils/notifications-utils.js +36 -35
  397. package/dist/utils/observe-dimensions.js +36 -41
  398. package/dist/utils/projection-utils.js +9 -20
  399. package/dist/utils/searcher-utils.js +1 -4
  400. package/dist/utils/split-map-utils.js +36 -32
  401. package/dist/utils/table-utils/data-container-utils.js +27 -23
  402. package/dist/utils/table-utils/data-row.js +2 -13
  403. package/dist/utils/table-utils/index.js +1 -2
  404. package/dist/utils/table-utils/indexed-data-container.js +65 -84
  405. package/dist/utils/table-utils/kepler-table.js +83 -126
  406. package/dist/utils/table-utils/row-data-container.js +62 -87
  407. package/dist/utils/utils.js +51 -69
  408. package/package.json +4 -3
  409. package/src/components/kepler-gl.d.ts +0 -1
  410. package/src/components/kepler-gl.js +0 -7
  411. package/src/components/map-container.js +0 -3
  412. package/src/components/modal-container.d.ts +0 -1
  413. package/src/components/modal-container.js +0 -2
  414. package/src/components/modals/add-map-style-modal.js +0 -3
  415. package/src/utils/gl-utils.js +2 -4
  416. package/CHANGELOG.md +0 -954
@@ -1,68 +1,65 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
7
+ exports.addFilter = addFilter;
8
+ exports.addLayer = addLayer;
9
+ exports.applyCPUFilter = applyCPUFilter;
10
+ exports.copyTableColumn = copyTableColumn;
11
+ exports.deleteFeature = deleteFeature;
12
+ exports.duplicateLayer = duplicateLayer;
13
+ exports.enlargeFilter = enlargeFilter;
14
+ exports.interactionConfigChange = interactionConfigChange;
15
+ exports.layerColorUIChange = layerColorUIChange;
8
16
  exports.layerConfigChange = layerConfigChange;
9
17
  exports.layerTextLabelChange = layerTextLabelChange;
10
18
  exports.layerTypeChange = layerTypeChange;
11
- exports.layerVisualChannelConfigChange = layerVisualChannelConfigChange;
12
19
  exports.layerVisConfigChange = layerVisConfigChange;
13
- exports.layerColorUIChange = layerColorUIChange;
14
- exports.updateLayerBlending = updateLayerBlending;
15
- exports.interactionConfigChange = interactionConfigChange;
20
+ exports.layerVisualChannelConfigChange = layerVisualChannelConfigChange;
21
+ exports.loadFileStepSuccess = loadFileStepSuccess;
22
+ exports.loadFiles = loadFiles;
23
+ exports.loadFilesErr = loadFilesErr;
24
+ exports.loadFilesSuccess = loadFilesSuccess;
25
+ exports.loadNextFile = loadNextFile;
26
+ exports.nextFileBatch = nextFileBatch;
27
+ exports.onLayerClick = onLayerClick;
28
+ exports.onLayerHover = onLayerHover;
29
+ exports.onMapClick = onMapClick;
30
+ exports.onMouseMove = onMouseMove;
31
+ exports.pinTableColumn = pinTableColumn;
32
+ exports.processFileContent = processFileContent;
33
+ exports.removeDataset = removeDataset;
34
+ exports.removeFilter = removeFilter;
35
+ exports.removeLayer = removeLayer;
36
+ exports.renameDataset = renameDataset;
37
+ exports.reorderLayer = reorderLayer;
38
+ exports.setEditorMode = setEditorMode;
39
+ exports.setFeatures = setFeatures;
16
40
  exports.setFilter = setFilter;
17
41
  exports.setFilterAnimationTime = setFilterAnimationTime;
42
+ exports.setFilterAnimationTimeConfig = setFilterAnimationTimeConfig;
18
43
  exports.setFilterAnimationWindow = setFilterAnimationWindow;
19
- exports.addFilter = addFilter;
20
- exports.addLayer = addLayer;
21
- exports.reorderLayer = reorderLayer;
22
- exports.removeFilter = removeFilter;
23
- exports.removeLayer = removeLayer;
24
- exports.duplicateLayer = duplicateLayer;
25
- exports.removeDataset = removeDataset;
44
+ exports.setFilterPlot = setFilterPlot;
45
+ exports.setLayerAnimationTime = setLayerAnimationTime;
46
+ exports.setLayerAnimationTimeConfig = setLayerAnimationTimeConfig;
47
+ exports.setMapInfo = setMapInfo;
48
+ exports.setPolygonFilterLayer = setPolygonFilterLayer;
49
+ exports.setSelectedFeature = setSelectedFeature;
26
50
  exports.showDatasetTable = showDatasetTable;
27
51
  exports.sortTableColumn = sortTableColumn;
28
- exports.pinTableColumn = pinTableColumn;
29
- exports.copyTableColumn = copyTableColumn;
30
- exports.updateVisData = updateVisData;
31
- exports.renameDataset = renameDataset;
52
+ exports.toggleEditorVisibility = toggleEditorVisibility;
32
53
  exports.toggleFilterAnimation = toggleFilterAnimation;
33
- exports.updateFilterAnimationSpeed = updateFilterAnimationSpeed;
34
- exports.setLayerAnimationTime = setLayerAnimationTime;
35
- exports.updateLayerAnimationSpeed = updateLayerAnimationSpeed;
54
+ exports.toggleFilterFeature = toggleFilterFeature;
36
55
  exports.toggleLayerAnimation = toggleLayerAnimation;
37
56
  exports.toggleLayerAnimationControl = toggleLayerAnimationControl;
38
- exports.enlargeFilter = enlargeFilter;
39
- exports.toggleFilterFeature = toggleFilterFeature;
40
- exports.onLayerHover = onLayerHover;
41
- exports.onLayerClick = onLayerClick;
42
- exports.onMapClick = onMapClick;
43
- exports.onMouseMove = onMouseMove;
44
57
  exports.toggleLayerForMap = toggleLayerForMap;
45
- exports.setFilterPlot = setFilterPlot;
46
- exports.setMapInfo = setMapInfo;
47
- exports.loadFiles = loadFiles;
48
- exports.loadNextFile = loadNextFile;
49
- exports.loadFilesSuccess = loadFilesSuccess;
50
- exports.loadFileStepSuccess = loadFileStepSuccess;
51
- exports.loadFilesErr = loadFilesErr;
52
- exports.setFeatures = setFeatures;
53
- exports.setPolygonFilterLayer = setPolygonFilterLayer;
54
- exports.setSelectedFeature = setSelectedFeature;
55
- exports.deleteFeature = deleteFeature;
56
- exports.setEditorMode = setEditorMode;
57
- exports.applyCPUFilter = applyCPUFilter;
58
- exports.toggleEditorVisibility = toggleEditorVisibility;
59
- exports.nextFileBatch = nextFileBatch;
60
- exports.processFileContent = processFileContent;
61
- exports.setLayerAnimationTimeConfig = setLayerAnimationTimeConfig;
62
- exports.setFilterAnimationTimeConfig = setFilterAnimationTimeConfig;
63
-
58
+ exports.updateFilterAnimationSpeed = updateFilterAnimationSpeed;
59
+ exports.updateLayerAnimationSpeed = updateLayerAnimationSpeed;
60
+ exports.updateLayerBlending = updateLayerBlending;
61
+ exports.updateVisData = updateVisData;
64
62
  var _actionTypes = _interopRequireDefault(require("../constants/action-types"));
65
-
66
63
  // Copyright (c) 2022 Uber Technologies, Inc.
67
64
  //
68
65
  // Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -82,6 +79,7 @@ var _actionTypes = _interopRequireDefault(require("../constants/action-types"));
82
79
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
83
80
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
84
81
  // THE SOFTWARE.
82
+
85
83
  // vis-state-reducer
86
84
 
87
85
  /**
@@ -99,6 +97,7 @@ function layerConfigChange(oldLayer, newConfig) {
99
97
  newConfig: newConfig
100
98
  };
101
99
  }
100
+
102
101
  /**
103
102
  * Update layer text label
104
103
  * @param oldLayer - layer to be updated
@@ -109,8 +108,6 @@ function layerConfigChange(oldLayer, newConfig) {
109
108
  * @type {typeof import('./vis-state-actions').layerTextLabelChange}
110
109
  * @public
111
110
  */
112
-
113
-
114
111
  function layerTextLabelChange(oldLayer, idx, prop, value) {
115
112
  return {
116
113
  type: _actionTypes["default"].LAYER_TEXT_LABEL_CHANGE,
@@ -120,6 +117,7 @@ function layerTextLabelChange(oldLayer, idx, prop, value) {
120
117
  value: value
121
118
  };
122
119
  }
120
+
123
121
  /**
124
122
  * Update layer type. Previews layer config will be copied if applicable.
125
123
  * @param oldLayer - layer to be updated
@@ -128,8 +126,6 @@ function layerTextLabelChange(oldLayer, idx, prop, value) {
128
126
  * @type {typeof import('./vis-state-actions').layerTypeChange}
129
127
  * @public
130
128
  */
131
-
132
-
133
129
  function layerTypeChange(oldLayer, newType) {
134
130
  return {
135
131
  type: _actionTypes["default"].LAYER_TYPE_CHANGE,
@@ -137,6 +133,7 @@ function layerTypeChange(oldLayer, newType) {
137
133
  newType: newType
138
134
  };
139
135
  }
136
+
140
137
  /**
141
138
  * Update layer visual channel
142
139
  * @memberof visStateActions
@@ -147,8 +144,6 @@ function layerTypeChange(oldLayer, newType) {
147
144
  * @type {typeof import('./vis-state-actions').layerVisualChannelConfigChange}
148
145
  * @public
149
146
  */
150
-
151
-
152
147
  function layerVisualChannelConfigChange(oldLayer, newConfig, channel) {
153
148
  return {
154
149
  type: _actionTypes["default"].LAYER_VISUAL_CHANNEL_CHANGE,
@@ -157,6 +152,7 @@ function layerVisualChannelConfigChange(oldLayer, newConfig, channel) {
157
152
  channel: channel
158
153
  };
159
154
  }
155
+
160
156
  /**
161
157
  * Update layer `visConfig`
162
158
  * @memberof visStateActions
@@ -166,8 +162,6 @@ function layerVisualChannelConfigChange(oldLayer, newConfig, channel) {
166
162
  * @type {typeof import('./vis-state-actions').layerVisConfigChange}
167
163
  * @public
168
164
  */
169
-
170
-
171
165
  function layerVisConfigChange(oldLayer, newVisConfig) {
172
166
  return {
173
167
  type: _actionTypes["default"].LAYER_VIS_CONFIG_CHANGE,
@@ -175,6 +169,7 @@ function layerVisConfigChange(oldLayer, newVisConfig) {
175
169
  newVisConfig: newVisConfig
176
170
  };
177
171
  }
172
+
178
173
  /**
179
174
  * Set the color palette ui for layer color
180
175
  * @memberOf visStateActions
@@ -185,8 +180,6 @@ function layerVisConfigChange(oldLayer, newVisConfig) {
185
180
  * @type {typeof import('./vis-state-actions').layerColorUIChange}
186
181
  * @public
187
182
  */
188
-
189
-
190
183
  function layerColorUIChange(oldLayer, prop, newConfig) {
191
184
  return {
192
185
  type: _actionTypes["default"].LAYER_COLOR_UI_CHANGE,
@@ -195,6 +188,7 @@ function layerColorUIChange(oldLayer, prop, newConfig) {
195
188
  newConfig: newConfig
196
189
  };
197
190
  }
191
+
198
192
  /**
199
193
  * Update layer blending mode
200
194
  * @memberof visStateActions
@@ -203,14 +197,13 @@ function layerColorUIChange(oldLayer, prop, newConfig) {
203
197
  * @type {typeof import('./vis-state-actions').updateLayerBlending}
204
198
  * @public
205
199
  */
206
-
207
-
208
200
  function updateLayerBlending(mode) {
209
201
  return {
210
202
  type: _actionTypes["default"].UPDATE_LAYER_BLENDING,
211
203
  mode: mode
212
204
  };
213
205
  }
206
+
214
207
  /**
215
208
  * Update `interactionConfig`
216
209
  * @memberof visStateActions
@@ -219,14 +212,13 @@ function updateLayerBlending(mode) {
219
212
  * @type {typeof import('./vis-state-actions').interactionConfigChange}
220
213
  * @public
221
214
  */
222
-
223
-
224
215
  function interactionConfigChange(config) {
225
216
  return {
226
217
  type: _actionTypes["default"].INTERACTION_CONFIG_CHANGE,
227
218
  config: config
228
219
  };
229
220
  }
221
+
230
222
  /**
231
223
  * Update filter property
232
224
  * @memberof visStateActions
@@ -238,8 +230,6 @@ function interactionConfigChange(config) {
238
230
  * @type {typeof import('./vis-state-actions').setFilter}
239
231
  * @public
240
232
  */
241
-
242
-
243
233
  function setFilter(idx, prop, value, valueIndex) {
244
234
  return {
245
235
  type: _actionTypes["default"].SET_FILTER,
@@ -249,6 +239,7 @@ function setFilter(idx, prop, value, valueIndex) {
249
239
  valueIndex: valueIndex
250
240
  };
251
241
  }
242
+
252
243
  /**
253
244
  * Same as Update filter
254
245
  * @memberof visStateActions
@@ -260,8 +251,6 @@ function setFilter(idx, prop, value, valueIndex) {
260
251
  * @type {typeof import('./vis-state-actions').setFilterAnimationTime}
261
252
  * @public
262
253
  */
263
-
264
-
265
254
  function setFilterAnimationTime(idx, prop, value, valueIndex) {
266
255
  return {
267
256
  type: _actionTypes["default"].SET_FILTER_ANIMATION_TIME,
@@ -271,17 +260,16 @@ function setFilterAnimationTime(idx, prop, value, valueIndex) {
271
260
  valueIndex: valueIndex
272
261
  };
273
262
  }
263
+
274
264
  /**
275
265
  * Same as Update filter
276
266
  * @memberof visStateActions
277
267
  * @type {typeof import('./vis-state-actions').setFilterAnimationWindow}
278
268
  * @public
279
269
  */
280
-
281
-
282
270
  function setFilterAnimationWindow(_ref) {
283
271
  var id = _ref.id,
284
- animationWindow = _ref.animationWindow;
272
+ animationWindow = _ref.animationWindow;
285
273
  return {
286
274
  type: _actionTypes["default"].SET_FILTER_ANIMATION_WINDOW,
287
275
  id: id,
@@ -296,14 +284,13 @@ function setFilterAnimationWindow(_ref) {
296
284
  * @type {typeof import('./vis-state-actions').addFilter}
297
285
  * @public
298
286
  */
299
-
300
-
301
287
  function addFilter(dataId) {
302
288
  return {
303
289
  type: _actionTypes["default"].ADD_FILTER,
304
290
  dataId: dataId
305
291
  };
306
292
  }
293
+
307
294
  /**
308
295
  * Add a new layer
309
296
  * @memberof visStateActions
@@ -312,14 +299,13 @@ function addFilter(dataId) {
312
299
  * @type {typeof import('./vis-state-actions').addLayer}
313
300
  * @public
314
301
  */
315
-
316
-
317
302
  function addLayer(config) {
318
303
  return {
319
304
  type: _actionTypes["default"].ADD_LAYER,
320
305
  config: config
321
306
  };
322
307
  }
308
+
323
309
  /**
324
310
  * Reorder layer, order is an array of layer indexes, index 0 will be the one at the bottom
325
311
  * @memberof visStateActions
@@ -333,14 +319,13 @@ function addLayer(config) {
333
319
  * // `1` will be at the bottom, `3` will be at the top.
334
320
  * this.props.dispatch(reorderLayer([1, 0, 2, 3]));
335
321
  */
336
-
337
-
338
322
  function reorderLayer(order) {
339
323
  return {
340
324
  type: _actionTypes["default"].REORDER_LAYER,
341
325
  order: order
342
326
  };
343
327
  }
328
+
344
329
  /**
345
330
  * Remove a filter from `visState.filters`, once a filter is removed, data will be re-filtered and layer will be updated
346
331
  * @memberof visStateActions
@@ -349,14 +334,13 @@ function reorderLayer(order) {
349
334
  * @type {typeof import('./vis-state-actions').removeFilter}
350
335
  * @public
351
336
  */
352
-
353
-
354
337
  function removeFilter(idx) {
355
338
  return {
356
339
  type: _actionTypes["default"].REMOVE_FILTER,
357
340
  idx: idx
358
341
  };
359
342
  }
343
+
360
344
  /**
361
345
  * Remove a layer
362
346
  * @memberof visStateActions
@@ -365,14 +349,13 @@ function removeFilter(idx) {
365
349
  * @type {typeof import('./vis-state-actions').removeLayer}
366
350
  * @public
367
351
  */
368
-
369
-
370
352
  function removeLayer(idx) {
371
353
  return {
372
354
  type: _actionTypes["default"].REMOVE_LAYER,
373
355
  idx: idx
374
356
  };
375
357
  }
358
+
376
359
  /**
377
360
  * Duplicate a layer
378
361
  * @memberof visStateActions
@@ -381,14 +364,13 @@ function removeLayer(idx) {
381
364
  * @type {typeof import('./vis-state-actions').duplicateLayer}
382
365
  * @public
383
366
  */
384
-
385
-
386
367
  function duplicateLayer(idx) {
387
368
  return {
388
369
  type: _actionTypes["default"].DUPLICATE_LAYER,
389
370
  idx: idx
390
371
  };
391
372
  }
373
+
392
374
  /**
393
375
  * Remove a dataset and all layers, filters, tooltip configs that based on it
394
376
  * @memberof visStateActions
@@ -397,14 +379,13 @@ function duplicateLayer(idx) {
397
379
  * @type {typeof import('./vis-state-actions').removeDataset}
398
380
  * @public
399
381
  */
400
-
401
-
402
382
  function removeDataset(dataId) {
403
383
  return {
404
384
  type: _actionTypes["default"].REMOVE_DATASET,
405
385
  dataId: dataId
406
386
  };
407
387
  }
388
+
408
389
  /**
409
390
  * Display dataset table in a modal
410
391
  * @memberof visStateActions
@@ -413,14 +394,13 @@ function removeDataset(dataId) {
413
394
  * @type {typeof import('./vis-state-actions').showDatasetTable}
414
395
  * @public
415
396
  */
416
-
417
-
418
397
  function showDatasetTable(dataId) {
419
398
  return {
420
399
  type: _actionTypes["default"].SHOW_DATASET_TABLE,
421
400
  dataId: dataId
422
401
  };
423
402
  }
403
+
424
404
  /**
425
405
  * Sort dataset column, for table display
426
406
  * @memberof visStateActions
@@ -431,8 +411,6 @@ function showDatasetTable(dataId) {
431
411
  * @type {typeof import('./vis-state-actions').sortTableColumn}
432
412
  * @public
433
413
  */
434
-
435
-
436
414
  function sortTableColumn(dataId, column, mode) {
437
415
  return {
438
416
  type: _actionTypes["default"].SORT_TABLE_COLUMN,
@@ -441,6 +419,7 @@ function sortTableColumn(dataId, column, mode) {
441
419
  mode: mode
442
420
  };
443
421
  }
422
+
444
423
  /**
445
424
  * Pin dataset column, for table display
446
425
  * @param dataId
@@ -449,8 +428,6 @@ function sortTableColumn(dataId, column, mode) {
449
428
  * @type {typeof import('./vis-state-actions').pinTableColumn}
450
429
  * @public
451
430
  */
452
-
453
-
454
431
  function pinTableColumn(dataId, column) {
455
432
  return {
456
433
  type: _actionTypes["default"].PIN_TABLE_COLUMN,
@@ -458,6 +435,7 @@ function pinTableColumn(dataId, column) {
458
435
  column: column
459
436
  };
460
437
  }
438
+
461
439
  /**
462
440
  * Copy column, for table display
463
441
  * @param dataId
@@ -466,22 +444,21 @@ function pinTableColumn(dataId, column) {
466
444
  * @type {typeof import('./vis-state-actions').copyTableColumn}
467
445
  * @public
468
446
  */
469
-
470
-
471
447
  function copyTableColumn(dataId, column) {
472
448
  return {
473
449
  type: _actionTypes["default"].COPY_TABLE_COLUMN,
474
450
  dataId: dataId,
475
451
  column: column
476
452
  };
477
- } // * @param dataset.info -info of a dataset
453
+ }
454
+
455
+ // * @param dataset.info -info of a dataset
478
456
  // * @param dataset.info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
479
457
  // * @param dataset.info.label - A display name of this dataset
480
458
  // * @param dataset.data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
481
459
  // * @param dataset.data.fields - ***required** Array of fields,
482
460
  // * @param dataset.data.fields.name - ***required** Name of the field,
483
461
  // * @param dataset.data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
484
-
485
462
  /**
486
463
  * Add new dataset to `visState`, with option to load a map config along with the datasets
487
464
  * @memberof visStateActions
@@ -497,8 +474,6 @@ function copyTableColumn(dataId, column) {
497
474
  * @type {typeof import('./vis-state-actions').updateVisData}
498
475
  * @public
499
476
  */
500
-
501
-
502
477
  function updateVisData(datasets, options, config) {
503
478
  return {
504
479
  type: _actionTypes["default"].UPDATE_VIS_DATA,
@@ -507,6 +482,7 @@ function updateVisData(datasets, options, config) {
507
482
  config: config
508
483
  };
509
484
  }
485
+
510
486
  /**
511
487
  * Rename an existing dataset in `visState`
512
488
  * @memberof visStateActions
@@ -516,8 +492,6 @@ function updateVisData(datasets, options, config) {
516
492
  * @type {typeof import('./vis-state-actions').renameDataset}
517
493
  * @public
518
494
  */
519
-
520
-
521
495
  function renameDataset(dataId, label) {
522
496
  return {
523
497
  type: _actionTypes["default"].RENAME_DATASET,
@@ -525,6 +499,7 @@ function renameDataset(dataId, label) {
525
499
  label: label
526
500
  };
527
501
  }
502
+
528
503
  /**
529
504
  * Start and end filter animation
530
505
  * @memberof visStateActions
@@ -533,14 +508,13 @@ function renameDataset(dataId, label) {
533
508
  * @returns action
534
509
  * @public
535
510
  */
536
-
537
-
538
511
  function toggleFilterAnimation(idx) {
539
512
  return {
540
513
  type: _actionTypes["default"].TOGGLE_FILTER_ANIMATION,
541
514
  idx: idx
542
515
  };
543
516
  }
517
+
544
518
  /**
545
519
  * Change filter animation speed
546
520
  * @memberof visStateActions
@@ -550,8 +524,6 @@ function toggleFilterAnimation(idx) {
550
524
  * @returns action
551
525
  * @public
552
526
  */
553
-
554
-
555
527
  function updateFilterAnimationSpeed(idx, speed) {
556
528
  return {
557
529
  type: _actionTypes["default"].UPDATE_FILTER_ANIMATION_SPEED,
@@ -559,6 +531,7 @@ function updateFilterAnimationSpeed(idx, speed) {
559
531
  speed: speed
560
532
  };
561
533
  }
534
+
562
535
  /**
563
536
  * Reset animation
564
537
  * @memberof visStateActions
@@ -567,14 +540,13 @@ function updateFilterAnimationSpeed(idx, speed) {
567
540
  * @returns action
568
541
  * @public
569
542
  */
570
-
571
-
572
543
  function setLayerAnimationTime(value) {
573
544
  return {
574
545
  type: _actionTypes["default"].SET_LAYER_ANIMATION_TIME,
575
546
  value: value
576
547
  };
577
548
  }
549
+
578
550
  /**
579
551
  * update trip layer animation speed
580
552
  * @memberof visStateActions
@@ -583,14 +555,13 @@ function setLayerAnimationTime(value) {
583
555
  * @returns action
584
556
  * @public
585
557
  */
586
-
587
-
588
558
  function updateLayerAnimationSpeed(speed) {
589
559
  return {
590
560
  type: _actionTypes["default"].UPDATE_LAYER_ANIMATION_SPEED,
591
561
  speed: speed
592
562
  };
593
563
  }
564
+
594
565
  /**
595
566
  * start end end layer animation
596
567
  * @memberof visStateActions
@@ -598,13 +569,12 @@ function updateLayerAnimationSpeed(speed) {
598
569
  * @returns action
599
570
  * @public
600
571
  */
601
-
602
-
603
572
  function toggleLayerAnimation() {
604
573
  return {
605
574
  type: _actionTypes["default"].TOGGLE_LAYER_ANIMATION
606
575
  };
607
576
  }
577
+
608
578
  /**
609
579
  * hide and show layer animation control
610
580
  * @memberof visStateActions
@@ -612,13 +582,12 @@ function toggleLayerAnimation() {
612
582
  * @returns action
613
583
  * @public
614
584
  */
615
-
616
-
617
585
  function toggleLayerAnimationControl() {
618
586
  return {
619
587
  type: _actionTypes["default"].TOGGLE_LAYER_ANIMATION_CONTROL
620
588
  };
621
589
  }
590
+
622
591
  /**
623
592
  * Show larger time filter at bottom for time playback (apply to time filter only)
624
593
  * @memberof visStateActions
@@ -627,14 +596,13 @@ function toggleLayerAnimationControl() {
627
596
  * @returns action
628
597
  * @public
629
598
  */
630
-
631
-
632
599
  function enlargeFilter(idx) {
633
600
  return {
634
601
  type: _actionTypes["default"].ENLARGE_FILTER,
635
602
  idx: idx
636
603
  };
637
604
  }
605
+
638
606
  /**
639
607
  * Show/hide filter feature on map
640
608
  * @memberof visStateActions
@@ -642,14 +610,13 @@ function enlargeFilter(idx) {
642
610
  * @type {typeof import('./vis-state-actions').toggleFilterFeature}
643
611
  * @return action
644
612
  */
645
-
646
-
647
613
  function toggleFilterFeature(idx) {
648
614
  return {
649
615
  type: _actionTypes["default"].TOGGLE_FILTER_FEATURE,
650
616
  idx: idx
651
617
  };
652
618
  }
619
+
653
620
  /**
654
621
  * Trigger layer hover event with hovered object
655
622
  * @memberof visStateActions
@@ -658,14 +625,13 @@ function toggleFilterFeature(idx) {
658
625
  * @returns action
659
626
  * @public
660
627
  */
661
-
662
-
663
628
  function onLayerHover(info) {
664
629
  return {
665
630
  type: _actionTypes["default"].LAYER_HOVER,
666
631
  info: info
667
632
  };
668
633
  }
634
+
669
635
  /**
670
636
  * Trigger layer click event with clicked object
671
637
  * @memberof visStateActions
@@ -674,14 +640,13 @@ function onLayerHover(info) {
674
640
  * @returns action
675
641
  * @public
676
642
  */
677
-
678
-
679
643
  function onLayerClick(info) {
680
644
  return {
681
645
  type: _actionTypes["default"].LAYER_CLICK,
682
646
  info: info
683
647
  };
684
648
  }
649
+
685
650
  /**
686
651
  * Trigger map click event, unselect clicked object
687
652
  * @memberof visStateActions
@@ -689,13 +654,12 @@ function onLayerClick(info) {
689
654
  * @returns action
690
655
  * @public
691
656
  */
692
-
693
-
694
657
  function onMapClick() {
695
658
  return {
696
659
  type: _actionTypes["default"].MAP_CLICK
697
660
  };
698
661
  }
662
+
699
663
  /**
700
664
  * Trigger map mouse moveevent, payload would be
701
665
  * React-map-gl PointerEvent
@@ -707,14 +671,13 @@ function onMapClick() {
707
671
  * @returns action
708
672
  * @public
709
673
  */
710
-
711
-
712
674
  function onMouseMove(evt) {
713
675
  return {
714
676
  type: _actionTypes["default"].MOUSE_MOVE,
715
677
  evt: evt
716
678
  };
717
679
  }
680
+
718
681
  /**
719
682
  * Toggle visibility of a layer in a split map
720
683
  * @memberof visStateActions
@@ -724,8 +687,6 @@ function onMouseMove(evt) {
724
687
  * @returns action
725
688
  * @public
726
689
  */
727
-
728
-
729
690
  function toggleLayerForMap(mapIndex, layerId) {
730
691
  return {
731
692
  type: _actionTypes["default"].TOGGLE_LAYER_FOR_MAP,
@@ -733,6 +694,7 @@ function toggleLayerForMap(mapIndex, layerId) {
733
694
  layerId: layerId
734
695
  };
735
696
  }
697
+
736
698
  /**
737
699
  * Set the property of a filter plot
738
700
  * @memberof visStateActions
@@ -743,8 +705,6 @@ function toggleLayerForMap(mapIndex, layerId) {
743
705
  * @returns action
744
706
  * @public
745
707
  */
746
-
747
-
748
708
  function setFilterPlot(idx, newProp, valueIndex) {
749
709
  return {
750
710
  type: _actionTypes["default"].SET_FILTER_PLOT,
@@ -753,6 +713,7 @@ function setFilterPlot(idx, newProp, valueIndex) {
753
713
  valueIndex: valueIndex
754
714
  };
755
715
  }
716
+
756
717
  /**
757
718
  * Set the property of a filter plot
758
719
  * @memberof visStateActions
@@ -761,14 +722,13 @@ function setFilterPlot(idx, newProp, valueIndex) {
761
722
  * @returns action
762
723
  * @public
763
724
  */
764
-
765
-
766
725
  function setMapInfo(info) {
767
726
  return {
768
727
  type: _actionTypes["default"].SET_MAP_INFO,
769
728
  info: info
770
729
  };
771
730
  }
731
+
772
732
  /**
773
733
  * Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
774
734
  * @memberof visStateActions
@@ -777,8 +737,6 @@ function setMapInfo(info) {
777
737
  * @returns action
778
738
  * @public
779
739
  */
780
-
781
-
782
740
  function loadFiles(files, onFinish) {
783
741
  return {
784
742
  type: _actionTypes["default"].LOAD_FILES,
@@ -786,6 +744,7 @@ function loadFiles(files, onFinish) {
786
744
  onFinish: onFinish
787
745
  };
788
746
  }
747
+
789
748
  /**
790
749
  * Called with next file to load
791
750
  * @memberof visStateActions
@@ -793,13 +752,12 @@ function loadFiles(files, onFinish) {
793
752
  * @returns action
794
753
  * @public
795
754
  */
796
-
797
-
798
755
  function loadNextFile() {
799
756
  return {
800
757
  type: _actionTypes["default"].LOAD_NEXT_FILE
801
758
  };
802
759
  }
760
+
803
761
  /**
804
762
  * called when all files are processed and loaded
805
763
  * @memberof visStateActions
@@ -807,14 +765,13 @@ function loadNextFile() {
807
765
  * @type {typeof import('./vis-state-actions').loadFilesSuccess}
808
766
  * @returns action
809
767
  */
810
-
811
-
812
768
  function loadFilesSuccess(result) {
813
769
  return {
814
770
  type: _actionTypes["default"].LOAD_FILES_SUCCESS,
815
771
  result: result
816
772
  };
817
773
  }
774
+
818
775
  /**
819
776
  * called when successfully loaded one file, ready to move on to the next one
820
777
  * @memberof visStateActions
@@ -822,17 +779,16 @@ function loadFilesSuccess(result) {
822
779
  * @type {typeof import('./vis-state-actions').loadFileStepSuccess}
823
780
  * @returns action
824
781
  */
825
-
826
-
827
782
  function loadFileStepSuccess(_ref2) {
828
783
  var fileName = _ref2.fileName,
829
- fileCache = _ref2.fileCache;
784
+ fileCache = _ref2.fileCache;
830
785
  return {
831
786
  type: _actionTypes["default"].LOAD_FILE_STEP_SUCCESS,
832
787
  fileName: fileName,
833
788
  fileCache: fileCache
834
789
  };
835
790
  }
791
+
836
792
  /**
837
793
  * Trigger loading file error
838
794
  * @memberof visStateActions
@@ -841,8 +797,6 @@ function loadFileStepSuccess(_ref2) {
841
797
  * @returns action
842
798
  * @public
843
799
  */
844
-
845
-
846
800
  function loadFilesErr(fileName, error) {
847
801
  return {
848
802
  type: _actionTypes["default"].LOAD_FILES_ERR,
@@ -850,6 +804,7 @@ function loadFilesErr(fileName, error) {
850
804
  error: error
851
805
  };
852
806
  }
807
+
853
808
  /**
854
809
  * Store features to state
855
810
  * @memberof visStateActions
@@ -857,14 +812,13 @@ function loadFilesErr(fileName, error) {
857
812
  * @type {typeof import('./vis-state-actions').setFeatures}
858
813
  * @returns action
859
814
  */
860
-
861
-
862
815
  function setFeatures(features) {
863
816
  return {
864
817
  type: _actionTypes["default"].SET_FEATURES,
865
818
  features: features
866
819
  };
867
820
  }
821
+
868
822
  /**
869
823
  * It will apply the provide feature as filter to the given layer.
870
824
  * If the given feature is already applied as filter to the layer, it will remove the layer from the filter
@@ -874,8 +828,6 @@ function setFeatures(features) {
874
828
  * @type {typeof import('./vis-state-actions').setPolygonFilterLayer}
875
829
  * @returns action
876
830
  */
877
-
878
-
879
831
  function setPolygonFilterLayer(layer, feature) {
880
832
  return {
881
833
  type: _actionTypes["default"].SET_POLYGON_FILTER_LAYER,
@@ -883,6 +835,7 @@ function setPolygonFilterLayer(layer, feature) {
883
835
  feature: feature
884
836
  };
885
837
  }
838
+
886
839
  /**
887
840
  * Set the current feature to be edited/deleted
888
841
  * @memberof visStateActions
@@ -890,14 +843,13 @@ function setPolygonFilterLayer(layer, feature) {
890
843
  * @type {typeof import('./vis-state-actions').setSelectedFeature}
891
844
  * @returns action
892
845
  */
893
-
894
-
895
846
  function setSelectedFeature(feature) {
896
847
  return {
897
848
  type: _actionTypes["default"].SET_SELECTED_FEATURE,
898
849
  feature: feature
899
850
  };
900
851
  }
852
+
901
853
  /**
902
854
  * Delete the given feature
903
855
  * @memberof visStateActions
@@ -905,14 +857,13 @@ function setSelectedFeature(feature) {
905
857
  * @type {typeof import('./vis-state-actions').deleteFeature}
906
858
  * @returns action
907
859
  */
908
-
909
-
910
860
  function deleteFeature(feature) {
911
861
  return {
912
862
  type: _actionTypes["default"].DELETE_FEATURE,
913
863
  feature: feature
914
864
  };
915
865
  }
866
+
916
867
  /** Set the map mode
917
868
  * @memberof visStateActions
918
869
  * @param mode one of EDITOR_MODES
@@ -925,14 +876,13 @@ function deleteFeature(feature) {
925
876
  *
926
877
  * this.props.dispatch(setMapMode(EDITOR_MODES.DRAW_POLYGON));
927
878
  */
928
-
929
-
930
879
  function setEditorMode(mode) {
931
880
  return {
932
881
  type: _actionTypes["default"].SET_EDITOR_MODE,
933
882
  mode: mode
934
883
  };
935
884
  }
885
+
936
886
  /**
937
887
  * Trigger CPU filter of selected dataset
938
888
  * @memberof visStateActions
@@ -941,27 +891,25 @@ function setEditorMode(mode) {
941
891
  * @returns action
942
892
  * @public
943
893
  */
944
-
945
-
946
894
  function applyCPUFilter(dataId) {
947
895
  return {
948
896
  type: _actionTypes["default"].APPLY_CPU_FILTER,
949
897
  dataId: dataId
950
898
  };
951
899
  }
900
+
952
901
  /**
953
902
  * Toggle editor layer visibility
954
903
  * @memberof visStateActions
955
904
  * @type {typeof import('./vis-state-actions').toggleEditorVisibility}
956
905
  * @return action
957
906
  */
958
-
959
-
960
907
  function toggleEditorVisibility() {
961
908
  return {
962
909
  type: _actionTypes["default"].TOGGLE_EDITOR_VISIBILITY
963
910
  };
964
911
  }
912
+
965
913
  /**
966
914
  * Process the next file batch
967
915
  * @memberof visStateActions
@@ -969,14 +917,13 @@ function toggleEditorVisibility() {
969
917
  * @type {typeof import('./vis-state-actions').nextFileBatch}
970
918
  * @return action
971
919
  */
972
-
973
-
974
920
  function nextFileBatch(payload) {
975
921
  return {
976
922
  type: _actionTypes["default"].NEXT_FILE_BATCH,
977
923
  payload: payload
978
924
  };
979
925
  }
926
+
980
927
  /**
981
928
  * Process the file content
982
929
  * @memberof visStateActions
@@ -984,14 +931,13 @@ function nextFileBatch(payload) {
984
931
  * @type {typeof import('./vis-state-actions').processFileContent}
985
932
  * @return action
986
933
  */
987
-
988
-
989
934
  function processFileContent(payload) {
990
935
  return {
991
936
  type: _actionTypes["default"].PROCESS_FILE_CONTENT,
992
937
  payload: payload
993
938
  };
994
939
  }
940
+
995
941
  /**
996
942
  * Set layer animation time format and timezone
997
943
  * @memberof visStateActions
@@ -999,14 +945,13 @@ function processFileContent(payload) {
999
945
  * @type {typeof import('./vis-state-actions').setLayerAnimationTimeConfig}
1000
946
  * @return action
1001
947
  */
1002
-
1003
-
1004
948
  function setLayerAnimationTimeConfig(config) {
1005
949
  return {
1006
950
  type: _actionTypes["default"].SET_LAYER_ANIMATION_TIME_CONFIG,
1007
951
  config: config
1008
952
  };
1009
953
  }
954
+
1010
955
  /**
1011
956
  * Set Filter animation time format and timezone
1012
957
  * @memberof visStateActions
@@ -1015,8 +960,6 @@ function setLayerAnimationTimeConfig(config) {
1015
960
  * @type {typeof import('./vis-state-actions').setFilterAnimationTimeConfig}
1016
961
  * @return action
1017
962
  */
1018
-
1019
-
1020
963
  function setFilterAnimationTimeConfig(idx, config) {
1021
964
  return {
1022
965
  type: _actionTypes["default"].SET_FILTER_ANIMATION_TIME_CONFIG,
@@ -1024,10 +967,10 @@ function setFilterAnimationTimeConfig(idx, config) {
1024
967
  config: config
1025
968
  };
1026
969
  }
970
+
1027
971
  /**
1028
972
  * This declaration is needed to group actions in docs
1029
973
  */
1030
-
1031
974
  /**
1032
975
  * Actions handled mostly by `visState` reducer.
1033
976
  * They manage how data is processed, filtered and displayed on the map by operates on layers,
@@ -1035,11 +978,8 @@ function setFilterAnimationTimeConfig(idx, config) {
1035
978
  *
1036
979
  * @public
1037
980
  */
1038
-
1039
981
  /* eslint-disable no-unused-vars */
1040
982
  // @ts-ignore
1041
-
1042
-
1043
983
  var visStateActions = null;
1044
984
  /* eslint-enable no-unused-vars */
1045
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3Zpcy1zdGF0ZS1hY3Rpb25zLmpzIl0sIm5hbWVzIjpbImxheWVyQ29uZmlnQ2hhbmdlIiwib2xkTGF5ZXIiLCJuZXdDb25maWciLCJ0eXBlIiwiQWN0aW9uVHlwZXMiLCJMQVlFUl9DT05GSUdfQ0hBTkdFIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2UiLCJpZHgiLCJwcm9wIiwidmFsdWUiLCJMQVlFUl9URVhUX0xBQkVMX0NIQU5HRSIsImxheWVyVHlwZUNoYW5nZSIsIm5ld1R5cGUiLCJMQVlFUl9UWVBFX0NIQU5HRSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImNoYW5uZWwiLCJMQVlFUl9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsIm5ld1Zpc0NvbmZpZyIsIkxBWUVSX1ZJU19DT05GSUdfQ0hBTkdFIiwibGF5ZXJDb2xvclVJQ2hhbmdlIiwiTEFZRVJfQ09MT1JfVUlfQ0hBTkdFIiwidXBkYXRlTGF5ZXJCbGVuZGluZyIsIm1vZGUiLCJVUERBVEVfTEFZRVJfQkxFTkRJTkciLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZSIsImNvbmZpZyIsIklOVEVSQUNUSU9OX0NPTkZJR19DSEFOR0UiLCJzZXRGaWx0ZXIiLCJ2YWx1ZUluZGV4IiwiU0VUX0ZJTFRFUiIsInNldEZpbHRlckFuaW1hdGlvblRpbWUiLCJTRVRfRklMVEVSX0FOSU1BVElPTl9USU1FIiwic2V0RmlsdGVyQW5pbWF0aW9uV2luZG93IiwiaWQiLCJhbmltYXRpb25XaW5kb3ciLCJTRVRfRklMVEVSX0FOSU1BVElPTl9XSU5ET1ciLCJhZGRGaWx0ZXIiLCJkYXRhSWQiLCJBRERfRklMVEVSIiwiYWRkTGF5ZXIiLCJBRERfTEFZRVIiLCJyZW9yZGVyTGF5ZXIiLCJvcmRlciIsIlJFT1JERVJfTEFZRVIiLCJyZW1vdmVGaWx0ZXIiLCJSRU1PVkVfRklMVEVSIiwicmVtb3ZlTGF5ZXIiLCJSRU1PVkVfTEFZRVIiLCJkdXBsaWNhdGVMYXllciIsIkRVUExJQ0FURV9MQVlFUiIsInJlbW92ZURhdGFzZXQiLCJSRU1PVkVfREFUQVNFVCIsInNob3dEYXRhc2V0VGFibGUiLCJTSE9XX0RBVEFTRVRfVEFCTEUiLCJzb3J0VGFibGVDb2x1bW4iLCJjb2x1bW4iLCJTT1JUX1RBQkxFX0NPTFVNTiIsInBpblRhYmxlQ29sdW1uIiwiUElOX1RBQkxFX0NPTFVNTiIsImNvcHlUYWJsZUNvbHVtbiIsIkNPUFlfVEFCTEVfQ09MVU1OIiwidXBkYXRlVmlzRGF0YSIsImRhdGFzZXRzIiwib3B0aW9ucyIsIlVQREFURV9WSVNfREFUQSIsInJlbmFtZURhdGFzZXQiLCJsYWJlbCIsIlJFTkFNRV9EQVRBU0VUIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uIiwiVE9HR0xFX0ZJTFRFUl9BTklNQVRJT04iLCJ1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZCIsInNwZWVkIiwiVVBEQVRFX0ZJTFRFUl9BTklNQVRJT05fU1BFRUQiLCJzZXRMYXllckFuaW1hdGlvblRpbWUiLCJTRVRfTEFZRVJfQU5JTUFUSU9OX1RJTUUiLCJ1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkIiwiVVBEQVRFX0xBWUVSX0FOSU1BVElPTl9TUEVFRCIsInRvZ2dsZUxheWVyQW5pbWF0aW9uIiwiVE9HR0xFX0xBWUVSX0FOSU1BVElPTiIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbCIsIlRPR0dMRV9MQVlFUl9BTklNQVRJT05fQ09OVFJPTCIsImVubGFyZ2VGaWx0ZXIiLCJFTkxBUkdFX0ZJTFRFUiIsInRvZ2dsZUZpbHRlckZlYXR1cmUiLCJUT0dHTEVfRklMVEVSX0ZFQVRVUkUiLCJvbkxheWVySG92ZXIiLCJpbmZvIiwiTEFZRVJfSE9WRVIiLCJvbkxheWVyQ2xpY2siLCJMQVlFUl9DTElDSyIsIm9uTWFwQ2xpY2siLCJNQVBfQ0xJQ0siLCJvbk1vdXNlTW92ZSIsImV2dCIsIk1PVVNFX01PVkUiLCJ0b2dnbGVMYXllckZvck1hcCIsIm1hcEluZGV4IiwibGF5ZXJJZCIsIlRPR0dMRV9MQVlFUl9GT1JfTUFQIiwic2V0RmlsdGVyUGxvdCIsIm5ld1Byb3AiLCJTRVRfRklMVEVSX1BMT1QiLCJzZXRNYXBJbmZvIiwiU0VUX01BUF9JTkZPIiwibG9hZEZpbGVzIiwiZmlsZXMiLCJvbkZpbmlzaCIsIkxPQURfRklMRVMiLCJsb2FkTmV4dEZpbGUiLCJMT0FEX05FWFRfRklMRSIsImxvYWRGaWxlc1N1Y2Nlc3MiLCJyZXN1bHQiLCJMT0FEX0ZJTEVTX1NVQ0NFU1MiLCJsb2FkRmlsZVN0ZXBTdWNjZXNzIiwiZmlsZU5hbWUiLCJmaWxlQ2FjaGUiLCJMT0FEX0ZJTEVfU1RFUF9TVUNDRVNTIiwibG9hZEZpbGVzRXJyIiwiZXJyb3IiLCJMT0FEX0ZJTEVTX0VSUiIsInNldEZlYXR1cmVzIiwiZmVhdHVyZXMiLCJTRVRfRkVBVFVSRVMiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXIiLCJsYXllciIsImZlYXR1cmUiLCJTRVRfUE9MWUdPTl9GSUxURVJfTEFZRVIiLCJzZXRTZWxlY3RlZEZlYXR1cmUiLCJTRVRfU0VMRUNURURfRkVBVFVSRSIsImRlbGV0ZUZlYXR1cmUiLCJERUxFVEVfRkVBVFVSRSIsInNldEVkaXRvck1vZGUiLCJTRVRfRURJVE9SX01PREUiLCJhcHBseUNQVUZpbHRlciIsIkFQUExZX0NQVV9GSUxURVIiLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5IiwiVE9HR0xFX0VESVRPUl9WSVNJQklMSVRZIiwibmV4dEZpbGVCYXRjaCIsInBheWxvYWQiLCJORVhUX0ZJTEVfQkFUQ0giLCJwcm9jZXNzRmlsZUNvbnRlbnQiLCJQUk9DRVNTX0ZJTEVfQ09OVEVOVCIsInNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZyIsIlNFVF9MQVlFUl9BTklNQVRJT05fVElNRV9DT05GSUciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIiwiU0VUX0ZJTFRFUl9BTklNQVRJT05fVElNRV9DT05GSUciLCJ2aXNTdGF0ZUFjdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTs7QUFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsaUJBQVQsQ0FBMkJDLFFBQTNCLEVBQXFDQyxTQUFyQyxFQUFnRDtBQUNyRCxTQUFPO0FBQ0xDLElBQUFBLElBQUksRUFBRUMsd0JBQVlDLG1CQURiO0FBRUxKLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBO0FBSEssR0FBUDtBQUtEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNJLG9CQUFULENBQThCTCxRQUE5QixFQUF3Q00sR0FBeEMsRUFBNkNDLElBQTdDLEVBQW1EQyxLQUFuRCxFQUEwRDtBQUMvRCxTQUFPO0FBQ0xOLElBQUFBLElBQUksRUFBRUMsd0JBQVlNLHVCQURiO0FBRUxULElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMTSxJQUFBQSxHQUFHLEVBQUhBLEdBSEs7QUFJTEMsSUFBQUEsSUFBSSxFQUFKQSxJQUpLO0FBS0xDLElBQUFBLEtBQUssRUFBTEE7QUFMSyxHQUFQO0FBT0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxlQUFULENBQXlCVixRQUF6QixFQUFtQ1csT0FBbkMsRUFBNEM7QUFDakQsU0FBTztBQUNMVCxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZUyxpQkFEYjtBQUVMWixJQUFBQSxRQUFRLEVBQVJBLFFBRks7QUFHTFcsSUFBQUEsT0FBTyxFQUFQQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSw4QkFBVCxDQUF3Q2IsUUFBeEMsRUFBa0RDLFNBQWxELEVBQTZEYSxPQUE3RCxFQUFzRTtBQUMzRSxTQUFPO0FBQ0xaLElBQUFBLElBQUksRUFBRUMsd0JBQVlZLDJCQURiO0FBRUxmLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBLFNBSEs7QUFJTGEsSUFBQUEsT0FBTyxFQUFQQTtBQUpLLEdBQVA7QUFNRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0Usb0JBQVQsQ0FBOEJoQixRQUE5QixFQUF3Q2lCLFlBQXhDLEVBQXNEO0FBQzNELFNBQU87QUFDTGYsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWWUsdUJBRGI7QUFFTGxCLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMaUIsSUFBQUEsWUFBWSxFQUFaQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxrQkFBVCxDQUE0Qm5CLFFBQTVCLEVBQXNDTyxJQUF0QyxFQUE0Q04sU0FBNUMsRUFBdUQ7QUFDNUQsU0FBTztBQUNMQyxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZaUIscUJBRGI7QUFFTHBCLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMTyxJQUFBQSxJQUFJLEVBQUpBLElBSEs7QUFJTE4sSUFBQUEsU0FBUyxFQUFUQTtBQUpLLEdBQVA7QUFNRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNvQixtQkFBVCxDQUE2QkMsSUFBN0IsRUFBbUM7QUFDeEMsU0FBTztBQUNMcEIsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWW9CLHFCQURiO0FBRUxELElBQUFBLElBQUksRUFBSkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSx1QkFBVCxDQUFpQ0MsTUFBakMsRUFBeUM7QUFDOUMsU0FBTztBQUNMdkIsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWXVCLHlCQURiO0FBRUxELElBQUFBLE1BQU0sRUFBTkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxTQUFULENBQW1CckIsR0FBbkIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQ29CLFVBQXJDLEVBQWlEO0FBQ3RELFNBQU87QUFDTDFCLElBQUFBLElBQUksRUFBRUMsd0JBQVkwQixVQURiO0FBRUx2QixJQUFBQSxHQUFHLEVBQUhBLEdBRks7QUFHTEMsSUFBQUEsSUFBSSxFQUFKQSxJQUhLO0FBSUxDLElBQUFBLEtBQUssRUFBTEEsS0FKSztBQUtMb0IsSUFBQUEsVUFBVSxFQUFWQTtBQUxLLEdBQVA7QUFPRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNFLHNCQUFULENBQWdDeEIsR0FBaEMsRUFBcUNDLElBQXJDLEVBQTJDQyxLQUEzQyxFQUFrRG9CLFVBQWxELEVBQThEO0FBQ25FLFNBQU87QUFDTDFCLElBQUFBLElBQUksRUFBRUMsd0JBQVk0Qix5QkFEYjtBQUVMekIsSUFBQUEsR0FBRyxFQUFIQSxHQUZLO0FBR0xDLElBQUFBLElBQUksRUFBSkEsSUFISztBQUlMQyxJQUFBQSxLQUFLLEVBQUxBLEtBSks7QUFLTG9CLElBQUFBLFVBQVUsRUFBVkE7QUFMSyxHQUFQO0FBT0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNJLHdCQUFULE9BQXlEO0FBQUEsTUFBdEJDLEVBQXNCLFFBQXRCQSxFQUFzQjtBQUFBLE1BQWxCQyxlQUFrQixRQUFsQkEsZUFBa0I7QUFDOUQsU0FBTztBQUNMaEMsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWWdDLDJCQURiO0FBRUxGLElBQUFBLEVBQUUsRUFBRkEsRUFGSztBQUdMQyxJQUFBQSxlQUFlLEVBQWZBO0FBSEssR0FBUDtBQUtEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UsU0FBVCxDQUFtQkMsTUFBbkIsRUFBMkI7QUFDaEMsU0FBTztBQUNMbkMsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWW1DLFVBRGI7QUFFTEQsSUFBQUEsTUFBTSxFQUFOQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNFLFFBQVQsQ0FBa0JkLE1BQWxCLEVBQTBCO0FBQy9CLFNBQU87QUFDTHZCLElBQUFBLElBQUksRUFBRUMsd0JBQVlxQyxTQURiO0FBRUxmLElBQUFBLE1BQU0sRUFBTkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU2dCLFlBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU87QUFDTHhDLElBQUFBLElBQUksRUFBRUMsd0JBQVl3QyxhQURiO0FBRUxELElBQUFBLEtBQUssRUFBTEE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxZQUFULENBQXNCdEMsR0FBdEIsRUFBMkI7QUFDaEMsU0FBTztBQUNMSixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZMEMsYUFEYjtBQUVMdkMsSUFBQUEsR0FBRyxFQUFIQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVN3QyxXQUFULENBQXFCeEMsR0FBckIsRUFBMEI7QUFDL0IsU0FBTztBQUNMSixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZNEMsWUFEYjtBQUVMekMsSUFBQUEsR0FBRyxFQUFIQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVMwQyxjQUFULENBQXdCMUMsR0FBeEIsRUFBNkI7QUFDbEMsU0FBTztBQUNMSixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZOEMsZUFEYjtBQUVMM0MsSUFBQUEsR0FBRyxFQUFIQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVM0QyxhQUFULENBQXVCYixNQUF2QixFQUErQjtBQUNwQyxTQUFPO0FBQ0xuQyxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZZ0QsY0FEYjtBQUVMZCxJQUFBQSxNQUFNLEVBQU5BO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU2UsZ0JBQVQsQ0FBMEJmLE1BQTFCLEVBQWtDO0FBQ3ZDLFNBQU87QUFDTG5DLElBQUFBLElBQUksRUFBRUMsd0JBQVlrRCxrQkFEYjtBQUVMaEIsSUFBQUEsTUFBTSxFQUFOQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTaUIsZUFBVCxDQUF5QmpCLE1BQXpCLEVBQWlDa0IsTUFBakMsRUFBeUNqQyxJQUF6QyxFQUErQztBQUNwRCxTQUFPO0FBQ0xwQixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZcUQsaUJBRGI7QUFFTG5CLElBQUFBLE1BQU0sRUFBTkEsTUFGSztBQUdMa0IsSUFBQUEsTUFBTSxFQUFOQSxNQUhLO0FBSUxqQyxJQUFBQSxJQUFJLEVBQUpBO0FBSkssR0FBUDtBQU1EO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU21DLGNBQVQsQ0FBd0JwQixNQUF4QixFQUFnQ2tCLE1BQWhDLEVBQXdDO0FBQzdDLFNBQU87QUFDTHJELElBQUFBLElBQUksRUFBRUMsd0JBQVl1RCxnQkFEYjtBQUVMckIsSUFBQUEsTUFBTSxFQUFOQSxNQUZLO0FBR0xrQixJQUFBQSxNQUFNLEVBQU5BO0FBSEssR0FBUDtBQUtEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0ksZUFBVCxDQUF5QnRCLE1BQXpCLEVBQWlDa0IsTUFBakMsRUFBeUM7QUFDOUMsU0FBTztBQUNMckQsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWXlELGlCQURiO0FBRUx2QixJQUFBQSxNQUFNLEVBQU5BLE1BRks7QUFHTGtCLElBQUFBLE1BQU0sRUFBTkE7QUFISyxHQUFQO0FBS0QsQyxDQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU00sYUFBVCxDQUF1QkMsUUFBdkIsRUFBaUNDLE9BQWpDLEVBQTBDdEMsTUFBMUMsRUFBa0Q7QUFDdkQsU0FBTztBQUNMdkIsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTZELGVBRGI7QUFFTEYsSUFBQUEsUUFBUSxFQUFSQSxRQUZLO0FBR0xDLElBQUFBLE9BQU8sRUFBUEEsT0FISztBQUlMdEMsSUFBQUEsTUFBTSxFQUFOQTtBQUpLLEdBQVA7QUFNRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU3dDLGFBQVQsQ0FBdUI1QixNQUF2QixFQUErQjZCLEtBQS9CLEVBQXNDO0FBQzNDLFNBQU87QUFDTGhFLElBQUFBLElBQUksRUFBRUMsd0JBQVlnRSxjQURiO0FBRUw5QixJQUFBQSxNQUFNLEVBQU5BLE1BRks7QUFHTDZCLElBQUFBLEtBQUssRUFBTEE7QUFISyxHQUFQO0FBS0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxxQkFBVCxDQUErQjlELEdBQS9CLEVBQW9DO0FBQ3pDLFNBQU87QUFDTEosSUFBQUEsSUFBSSxFQUFFQyx3QkFBWWtFLHVCQURiO0FBRUwvRCxJQUFBQSxHQUFHLEVBQUhBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTZ0UsMEJBQVQsQ0FBb0NoRSxHQUFwQyxFQUF5Q2lFLEtBQXpDLEVBQWdEO0FBQ3JELFNBQU87QUFDTHJFLElBQUFBLElBQUksRUFBRUMsd0JBQVlxRSw2QkFEYjtBQUVMbEUsSUFBQUEsR0FBRyxFQUFIQSxHQUZLO0FBR0xpRSxJQUFBQSxLQUFLLEVBQUxBO0FBSEssR0FBUDtBQUtEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UscUJBQVQsQ0FBK0JqRSxLQUEvQixFQUFzQztBQUMzQyxTQUFPO0FBQ0xOLElBQUFBLElBQUksRUFBRUMsd0JBQVl1RSx3QkFEYjtBQUVMbEUsSUFBQUEsS0FBSyxFQUFMQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNtRSx5QkFBVCxDQUFtQ0osS0FBbkMsRUFBMEM7QUFDL0MsU0FBTztBQUNMckUsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWXlFLDRCQURiO0FBRUxMLElBQUFBLEtBQUssRUFBTEE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU00sb0JBQVQsR0FBZ0M7QUFDckMsU0FBTztBQUNMM0UsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTJFO0FBRGIsR0FBUDtBQUdEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLDJCQUFULEdBQXVDO0FBQzVDLFNBQU87QUFDTDdFLElBQUFBLElBQUksRUFBRUMsd0JBQVk2RTtBQURiLEdBQVA7QUFHRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLGFBQVQsQ0FBdUIzRSxHQUF2QixFQUE0QjtBQUNqQyxTQUFPO0FBQ0xKLElBQUFBLElBQUksRUFBRUMsd0JBQVkrRSxjQURiO0FBRUw1RSxJQUFBQSxHQUFHLEVBQUhBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVM2RSxtQkFBVCxDQUE2QjdFLEdBQTdCLEVBQWtDO0FBQ3ZDLFNBQU87QUFDTEosSUFBQUEsSUFBSSxFQUFFQyx3QkFBWWlGLHFCQURiO0FBRUw5RSxJQUFBQSxHQUFHLEVBQUhBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBUytFLFlBQVQsQ0FBc0JDLElBQXRCLEVBQTRCO0FBQ2pDLFNBQU87QUFDTHBGLElBQUFBLElBQUksRUFBRUMsd0JBQVlvRixXQURiO0FBRUxELElBQUFBLElBQUksRUFBSkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxZQUFULENBQXNCRixJQUF0QixFQUE0QjtBQUNqQyxTQUFPO0FBQ0xwRixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZc0YsV0FEYjtBQUVMSCxJQUFBQSxJQUFJLEVBQUpBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNJLFVBQVQsR0FBc0I7QUFDM0IsU0FBTztBQUNMeEYsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWXdGO0FBRGIsR0FBUDtBQUdEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEI7QUFDL0IsU0FBTztBQUNMM0YsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTJGLFVBRGI7QUFFTEQsSUFBQUEsR0FBRyxFQUFIQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UsaUJBQVQsQ0FBMkJDLFFBQTNCLEVBQXFDQyxPQUFyQyxFQUE4QztBQUNuRCxTQUFPO0FBQ0wvRixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZK0Ysb0JBRGI7QUFFTEYsSUFBQUEsUUFBUSxFQUFSQSxRQUZLO0FBR0xDLElBQUFBLE9BQU8sRUFBUEE7QUFISyxHQUFQO0FBS0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UsYUFBVCxDQUF1QjdGLEdBQXZCLEVBQTRCOEYsT0FBNUIsRUFBcUN4RSxVQUFyQyxFQUFpRDtBQUN0RCxTQUFPO0FBQ0wxQixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZa0csZUFEYjtBQUVML0YsSUFBQUEsR0FBRyxFQUFIQSxHQUZLO0FBR0w4RixJQUFBQSxPQUFPLEVBQVBBLE9BSEs7QUFJTHhFLElBQUFBLFVBQVUsRUFBVkE7QUFKSyxHQUFQO0FBTUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTMEUsVUFBVCxDQUFvQmhCLElBQXBCLEVBQTBCO0FBQy9CLFNBQU87QUFDTHBGLElBQUFBLElBQUksRUFBRUMsd0JBQVlvRyxZQURiO0FBRUxqQixJQUFBQSxJQUFJLEVBQUpBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU2tCLFNBQVQsQ0FBbUJDLEtBQW5CLEVBQTBCQyxRQUExQixFQUFvQztBQUN6QyxTQUFPO0FBQ0x4RyxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZd0csVUFEYjtBQUVMRixJQUFBQSxLQUFLLEVBQUxBLEtBRks7QUFHTEMsSUFBQUEsUUFBUSxFQUFSQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxZQUFULEdBQXdCO0FBQzdCLFNBQU87QUFDTDFHLElBQUFBLElBQUksRUFBRUMsd0JBQVkwRztBQURiLEdBQVA7QUFHRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTQyxnQkFBVCxDQUEwQkMsTUFBMUIsRUFBa0M7QUFDdkMsU0FBTztBQUNMN0csSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTZHLGtCQURiO0FBRUxELElBQUFBLE1BQU0sRUFBTkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UsbUJBQVQsUUFBb0Q7QUFBQSxNQUF0QkMsUUFBc0IsU0FBdEJBLFFBQXNCO0FBQUEsTUFBWkMsU0FBWSxTQUFaQSxTQUFZO0FBQ3pELFNBQU87QUFDTGpILElBQUFBLElBQUksRUFBRUMsd0JBQVlpSCxzQkFEYjtBQUVMRixJQUFBQSxRQUFRLEVBQVJBLFFBRks7QUFHTEMsSUFBQUEsU0FBUyxFQUFUQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNFLFlBQVQsQ0FBc0JILFFBQXRCLEVBQWdDSSxLQUFoQyxFQUF1QztBQUM1QyxTQUFPO0FBQ0xwSCxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZb0gsY0FEYjtBQUVMTCxJQUFBQSxRQUFRLEVBQVJBLFFBRks7QUFHTEksSUFBQUEsS0FBSyxFQUFMQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxXQUFULENBQXFCQyxRQUFyQixFQUErQjtBQUNwQyxTQUFPO0FBQ0x2SCxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZdUgsWUFEYjtBQUVMRCxJQUFBQSxRQUFRLEVBQVJBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxxQkFBVCxDQUErQkMsS0FBL0IsRUFBc0NDLE9BQXRDLEVBQStDO0FBQ3BELFNBQU87QUFDTDNILElBQUFBLElBQUksRUFBRUMsd0JBQVkySCx3QkFEYjtBQUVMRixJQUFBQSxLQUFLLEVBQUxBLEtBRks7QUFHTEMsSUFBQUEsT0FBTyxFQUFQQTtBQUhLLEdBQVA7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxrQkFBVCxDQUE0QkYsT0FBNUIsRUFBcUM7QUFDMUMsU0FBTztBQUNMM0gsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTZILG9CQURiO0FBRUxILElBQUFBLE9BQU8sRUFBUEE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0ksYUFBVCxDQUF1QkosT0FBdkIsRUFBZ0M7QUFDckMsU0FBTztBQUNMM0gsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWStILGNBRGI7QUFFTEwsSUFBQUEsT0FBTyxFQUFQQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU00sYUFBVCxDQUF1QjdHLElBQXZCLEVBQTZCO0FBQ2xDLFNBQU87QUFDTHBCLElBQUFBLElBQUksRUFBRUMsd0JBQVlpSSxlQURiO0FBRUw5RyxJQUFBQSxJQUFJLEVBQUpBO0FBRkssR0FBUDtBQUlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBUytHLGNBQVQsQ0FBd0JoRyxNQUF4QixFQUFnQztBQUNyQyxTQUFPO0FBQ0xuQyxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZbUksZ0JBRGI7QUFFTGpHLElBQUFBLE1BQU0sRUFBTkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNrRyxzQkFBVCxHQUFrQztBQUN2QyxTQUFPO0FBQ0xySSxJQUFBQSxJQUFJLEVBQUVDLHdCQUFZcUk7QUFEYixHQUFQO0FBR0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0MsYUFBVCxDQUF1QkMsT0FBdkIsRUFBZ0M7QUFDckMsU0FBTztBQUNMeEksSUFBQUEsSUFBSSxFQUFFQyx3QkFBWXdJLGVBRGI7QUFFTEQsSUFBQUEsT0FBTyxFQUFQQTtBQUZLLEdBQVA7QUFJRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxrQkFBVCxDQUE0QkYsT0FBNUIsRUFBcUM7QUFDMUMsU0FBTztBQUNMeEksSUFBQUEsSUFBSSxFQUFFQyx3QkFBWTBJLG9CQURiO0FBRUxILElBQUFBLE9BQU8sRUFBUEE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0ksMkJBQVQsQ0FBcUNySCxNQUFyQyxFQUE2QztBQUNsRCxTQUFPO0FBQ0x2QixJQUFBQSxJQUFJLEVBQUVDLHdCQUFZNEksK0JBRGI7QUFFTHRILElBQUFBLE1BQU0sRUFBTkE7QUFGSyxHQUFQO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTdUgsNEJBQVQsQ0FBc0MxSSxHQUF0QyxFQUEyQ21CLE1BQTNDLEVBQW1EO0FBQ3hELFNBQU87QUFDTHZCLElBQUFBLElBQUksRUFBRUMsd0JBQVk4SSxnQ0FEYjtBQUVMM0ksSUFBQUEsR0FBRyxFQUFIQSxHQUZLO0FBR0xtQixJQUFBQSxNQUFNLEVBQU5BO0FBSEssR0FBUDtBQUtEO0FBRUQ7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7OztBQUNBLElBQU15SCxlQUFlLEdBQUcsSUFBeEI7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIHZpcy1zdGF0ZS1yZWR1Y2VyXG5pbXBvcnQgQWN0aW9uVHlwZXMgZnJvbSAnY29uc3RhbnRzL2FjdGlvbi10eXBlcyc7XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJhc2UgY29uZmlnOiBkYXRhSWQsIGxhYmVsLCBjb2x1bW4sIGlzVmlzaWJsZVxuICogQHBhcmFtIG9sZExheWVyIC0gbGF5ZXIgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIG5ld0NvbmZpZyAtIG5ldyBjb25maWcgdG8gYmUgbWVyZ2VkIHdpdGggb2xkIGNvbmZpZ1xuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyQ29uZmlnQ2hhbmdlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJDb25maWdDaGFuZ2Uob2xkTGF5ZXIsIG5ld0NvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX0NPTkZJR19DSEFOR0UsXG4gICAgb2xkTGF5ZXIsXG4gICAgbmV3Q29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHRleHQgbGFiZWxcbiAqIEBwYXJhbSBvbGRMYXllciAtIGxheWVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBpZHggLWBpZHhgIG9mIHRleHQgbGFiZWwgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIHByb3AgLSBgcHJvcGAgb2YgdGV4dCBsYWJlbCwgZSxnLCBgYW5jaG9yYCwgYGFsaWdubWVudGAsIGBjb2xvcmAsIGBzaXplYCwgYGZpZWxkYFxuICogQHBhcmFtIHZhbHVlIC0gbmV3IHZhbHVlXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubGF5ZXJUZXh0TGFiZWxDaGFuZ2V9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclRleHRMYWJlbENoYW5nZShvbGRMYXllciwgaWR4LCBwcm9wLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1RFWFRfTEFCRUxfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIGlkeCxcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHR5cGUuIFByZXZpZXdzIGxheWVyIGNvbmZpZyB3aWxsIGJlIGNvcGllZCBpZiBhcHBsaWNhYmxlLlxuICogQHBhcmFtIG9sZExheWVyIC0gbGF5ZXIgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIG5ld1R5cGUgLSBuZXcgdHlwZVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyVHlwZUNoYW5nZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVHlwZUNoYW5nZShvbGRMYXllciwgbmV3VHlwZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1RZUEVfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1R5cGVcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdmlzdWFsIGNoYW5uZWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBvbGRMYXllciAtIGxheWVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBuZXdDb25maWcgLSBuZXcgdmlzdWFsIGNoYW5uZWwgY29uZmlnXG4gKiBAcGFyYW0gY2hhbm5lbCAtIGNoYW5uZWwgdG8gYmUgdXBkYXRlZFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfVklTVUFMX0NIQU5ORUxfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZyxcbiAgICBjaGFubmVsXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGB2aXNDb25maWdgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gb2xkTGF5ZXIgLSBsYXllciB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gbmV3VmlzQ29uZmlnIC0gbmV3IHZpc0NvbmZpZyBhcyBhIGtleSB2YWx1ZSBtYXA6IGUuZy4gYHtvcGFjaXR5OiAwLjh9YFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyVmlzQ29uZmlnQ2hhbmdlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXNDb25maWdDaGFuZ2Uob2xkTGF5ZXIsIG5ld1Zpc0NvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1ZJU19DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1Zpc0NvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFNldCB0aGUgY29sb3IgcGFsZXR0ZSB1aSBmb3IgbGF5ZXIgY29sb3JcbiAqIEBtZW1iZXJPZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBvbGRMYXllciAtIGxheWVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBwcm9wIC0gd2hpY2ggY29sb3IgcHJvcFxuICogQHBhcmFtIG5ld0NvbmZpZyAtIHRvIGJlIG1lcmdlZFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyQ29sb3JVSUNoYW5nZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyQ29sb3JVSUNoYW5nZShvbGRMYXllciwgcHJvcCwgbmV3Q29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfQ09MT1JfVUlfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIHByb3AsXG4gICAgbmV3Q29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBtb2RlIG9uZSBvZiBgYWRkaXRpdmVgLCBgbm9ybWFsYCBhbmQgYHN1YnRyYWN0aXZlYFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnVwZGF0ZUxheWVyQmxlbmRpbmd9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMYXllckJsZW5kaW5nKG1vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfTEFZRVJfQkxFTkRJTkcsXG4gICAgbW9kZVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBgaW50ZXJhY3Rpb25Db25maWdgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gY29uZmlnIC0gbmV3IGNvbmZpZyBhcyBrZXkgdmFsdWUgbWFwOiBge3Rvb2x0aXA6IHtlbmFibGVkOiB0cnVlfX1gXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuaW50ZXJhY3Rpb25Db25maWdDaGFuZ2V9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZShjb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTlRFUkFDVElPTl9DT05GSUdfQ0hBTkdFLFxuICAgIGNvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHggLWBpZHhgIG9mIGZpbHRlciB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gcHJvcCAtIGBwcm9wYCBvZiBmaWx0ZXIsIGUsZywgYGRhdGFJZGAsIGBuYW1lYCwgYHZhbHVlYFxuICogQHBhcmFtIHZhbHVlIC0gbmV3IHZhbHVlXG4gKiBAcGFyYW0gdmFsdWVJbmRleCAtIGRhdGFJZCBpbmRleFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldEZpbHRlcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlcihpZHgsIHByb3AsIHZhbHVlLCB2YWx1ZUluZGV4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0ZJTFRFUixcbiAgICBpZHgsXG4gICAgcHJvcCxcbiAgICB2YWx1ZSxcbiAgICB2YWx1ZUluZGV4XG4gIH07XG59XG5cbi8qKlxuICogU2FtZSBhcyBVcGRhdGUgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IC1gaWR4YCBvZiBmaWx0ZXIgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIHByb3AgLSBgcHJvcGAgb2YgZmlsdGVyLCBlLGcsIGBkYXRhSWRgLCBgbmFtZWAsIGB2YWx1ZWBcbiAqIEBwYXJhbSB2YWx1ZSAtIG5ldyB2YWx1ZVxuICogQHBhcmFtIHZhbHVlSW5kZXggLSBkYXRhSWQgaW5kZXhcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGaWx0ZXJBbmltYXRpb25UaW1lfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uVGltZShpZHgsIHByb3AsIHZhbHVlLCB2YWx1ZUluZGV4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0ZJTFRFUl9BTklNQVRJT05fVElNRSxcbiAgICBpZHgsXG4gICAgcHJvcCxcbiAgICB2YWx1ZSxcbiAgICB2YWx1ZUluZGV4XG4gIH07XG59XG5cbi8qKlxuICogU2FtZSBhcyBVcGRhdGUgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldEZpbHRlckFuaW1hdGlvbldpbmRvd31cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvbldpbmRvdyh7aWQsIGFuaW1hdGlvbldpbmRvd30pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSX0FOSU1BVElPTl9XSU5ET1csXG4gICAgaWQsXG4gICAgYW5pbWF0aW9uV2luZG93XG4gIH07XG59XG4vKipcbiAqIEFkZCBhIG5ldyBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBkYXRhSWQgLSBkYXRhc2V0IGBpZGAgdGhpcyBuZXcgZmlsdGVyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmFkZEZpbHRlcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpbHRlcihkYXRhSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5BRERfRklMVEVSLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqIEFkZCBhIG5ldyBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGNvbmZpZyAtIG5ldyBsYXllciBjb25maWdcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5hZGRMYXllcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExheWVyKGNvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFERF9MQVlFUixcbiAgICBjb25maWdcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW9yZGVyIGxheWVyLCBvcmRlciBpcyBhbiBhcnJheSBvZiBsYXllciBpbmRleGVzLCBpbmRleCAwIHdpbGwgYmUgdGhlIG9uZSBhdCB0aGUgYm90dG9tXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gb3JkZXIgYW4gYXJyYXkgb2YgbGF5ZXIgaW5kZXhlc1xuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnJlb3JkZXJMYXllcn1cbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gYnJpbmcgYGxheWVyc1sxXWAgYmVsb3cgYGxheWVyc1swXWAsIHRoZSBzZXF1ZW5jZSBsYXllcnMgd2lsbCBiZSByZW5kZXJlZCBpcyBgMWAsIGAwYCwgYDJgLCBgM2AuXG4gKiAvLyBgMWAgd2lsbCBiZSBhdCB0aGUgYm90dG9tLCBgM2Agd2lsbCBiZSBhdCB0aGUgdG9wLlxuICogdGhpcy5wcm9wcy5kaXNwYXRjaChyZW9yZGVyTGF5ZXIoWzEsIDAsIDIsIDNdKSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW9yZGVyTGF5ZXIob3JkZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU9SREVSX0xBWUVSLFxuICAgIG9yZGVyXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZmlsdGVyIGZyb20gYHZpc1N0YXRlLmZpbHRlcnNgLCBvbmNlIGEgZmlsdGVyIGlzIHJlbW92ZWQsIGRhdGEgd2lsbCBiZSByZS1maWx0ZXJlZCBhbmQgbGF5ZXIgd2lsbCBiZSB1cGRhdGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IGlkeCBvZiBmaWx0ZXIgdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnJlbW92ZUZpbHRlcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZpbHRlcihpZHgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfRklMVEVSLFxuICAgIGlkeFxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IGlkeCBvZiBsYXllciB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykucmVtb3ZlTGF5ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMYXllcihpZHgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfTEFZRVIsXG4gICAgaWR4XG4gIH07XG59XG5cbi8qKlxuICogRHVwbGljYXRlIGEgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHggaWR4IG9mIGxheWVyIHRvIGJlIGR1cGxpY2F0ZWRcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5kdXBsaWNhdGVMYXllcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGR1cGxpY2F0ZUxheWVyKGlkeCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkRVUExJQ0FURV9MQVlFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBkYXRhc2V0IGFuZCBhbGwgbGF5ZXJzLCBmaWx0ZXJzLCB0b29sdGlwIGNvbmZpZ3MgdGhhdCBiYXNlZCBvbiBpdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGRhdGFJZCBkYXRhc2V0IGlkXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykucmVtb3ZlRGF0YXNldH1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURhdGFzZXQoZGF0YUlkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVNT1ZFX0RBVEFTRVQsXG4gICAgZGF0YUlkXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGxheSBkYXRhc2V0IHRhYmxlIGluIGEgbW9kYWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBkYXRhSWQgZGF0YXNldCBpZCB0byBzaG93IGluIHRhYmxlXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2hvd0RhdGFzZXRUYWJsZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dEYXRhc2V0VGFibGUoZGF0YUlkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0hPV19EQVRBU0VUX1RBQkxFLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqIFNvcnQgZGF0YXNldCBjb2x1bW4sIGZvciB0YWJsZSBkaXNwbGF5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZGF0YUlkXG4gKiBAcGFyYW0gY29sdW1uXG4gKiBAcGFyYW0gbW9kZVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNvcnRUYWJsZUNvbHVtbn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRUYWJsZUNvbHVtbihkYXRhSWQsIGNvbHVtbiwgbW9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNPUlRfVEFCTEVfQ09MVU1OLFxuICAgIGRhdGFJZCxcbiAgICBjb2x1bW4sXG4gICAgbW9kZVxuICB9O1xufVxuXG4vKipcbiAqIFBpbiBkYXRhc2V0IGNvbHVtbiwgZm9yIHRhYmxlIGRpc3BsYXlcbiAqIEBwYXJhbSBkYXRhSWRcbiAqIEBwYXJhbSBjb2x1bW5cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5waW5UYWJsZUNvbHVtbn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpblRhYmxlQ29sdW1uKGRhdGFJZCwgY29sdW1uKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUElOX1RBQkxFX0NPTFVNTixcbiAgICBkYXRhSWQsXG4gICAgY29sdW1uXG4gIH07XG59XG5cbi8qKlxuICogQ29weSBjb2x1bW4sIGZvciB0YWJsZSBkaXNwbGF5XG4gKiBAcGFyYW0gZGF0YUlkXG4gKiBAcGFyYW0gY29sdW1uXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuY29weVRhYmxlQ29sdW1ufVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlQ29sdW1uKGRhdGFJZCwgY29sdW1uKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuQ09QWV9UQUJMRV9DT0xVTU4sXG4gICAgZGF0YUlkLFxuICAgIGNvbHVtblxuICB9O1xufVxuXG4vLyAqIEBwYXJhbSBkYXRhc2V0LmluZm8gLWluZm8gb2YgYSBkYXRhc2V0XG4vLyAqIEBwYXJhbSBkYXRhc2V0LmluZm8uaWQgLSBpZCBvZiB0aGlzIGRhdGFzZXQuIElmIGNvbmZpZyBpcyBkZWZpbmVkLCBgaWRgIHNob3VsZCBtYXRjaGVzIHRoZSBgZGF0YUlkYCBpbiBjb25maWcuXG4vLyAqIEBwYXJhbSBkYXRhc2V0LmluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbi8vICogQHBhcmFtIGRhdGFzZXQuZGF0YSAtICoqKnJlcXVpcmVkKiogVGhlIGRhdGEgb2JqZWN0LCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggMiBwcm9wZXJ0aWVzIGBmaWVsZHNgIGFuZCBgcm93c2Bcbi8vICogQHBhcmFtIGRhdGFzZXQuZGF0YS5maWVsZHMgLSAqKipyZXF1aXJlZCoqIEFycmF5IG9mIGZpZWxkcyxcbi8vICogQHBhcmFtIGRhdGFzZXQuZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4vLyAqIEBwYXJhbSBkYXRhc2V0LmRhdGEucm93cyAtICoqKnJlcXVpcmVkKiogQXJyYXkgb2Ygcm93cywgaW4gYSB0YWJ1bGFyIGZvcm1hdCB3aXRoIGBmaWVsZHNgIGFuZCBgcm93c2Bcbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZGF0YXNldHMgLSAqKipyZXF1aXJlZCoqIGRhdGFzZXRzIGNhbiBiZSBhIGRhdGFzZXQgb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqIEVhY2ggZGF0YXNldCBvYmplY3QgbmVlZHMgdG8gaGF2ZSBgaW5mb2AgYW5kIGBkYXRhYCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5jZW50ZXJNYXAgYGRlZmF1bHQ6IHRydWVgIGlmIGBjZW50ZXJNYXBgIGlzIHNldCB0byBgdHJ1ZWAga2VwbGVyLmdsIHdpbGxcbiAqIHBsYWNlIHRoZSBtYXAgdmlldyB3aXRoaW4gdGhlIGRhdGEgcG9pbnRzIGJvdW5kYXJpZXNcbiAqIEBwYXJhbSBvcHRpb25zLnJlYWRPbmx5IGBkZWZhdWx0OiBmYWxzZWAgaWYgYHJlYWRPbmx5YCBpcyBzZXQgdG8gYHRydWVgXG4gKiB0aGUgbGVmdCBzZXR0aW5nIHBhbmVsIHdpbGwgYmUgaGlkZGVuXG4gKiBAcGFyYW0gY29uZmlnIHRoaXMgb2JqZWN0IHdpbGwgY29udGFpbiB0aGUgZnVsbCBrZXBsZXIuZ2wgaW5zdGFuY2UgY29uZmlndXJhdGlvbiB7bWFwU3RhdGUsIG1hcFN0eWxlLCB2aXNTdGF0ZX1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS51cGRhdGVWaXNEYXRhfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmlzRGF0YShkYXRhc2V0cywgb3B0aW9ucywgY29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVVBEQVRFX1ZJU19EQVRBLFxuICAgIGRhdGFzZXRzLFxuICAgIG9wdGlvbnMsXG4gICAgY29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGRhdGFJZCAtICoqKnJlcXVpcmVkKiogSWQgb2YgdGhlIGRhdGFzZXQgdG8gdXBkYXRlXG4gKiBAcGFyYW0gbGFiZWwgLSAqKipyZXF1aXJlZCoqIE5ldyBuYW1lIGZvciB0aGUgZGF0YXNldFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnJlbmFtZURhdGFzZXR9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVEYXRhc2V0KGRhdGFJZCwgbGFiZWwpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU5BTUVfREFUQVNFVCxcbiAgICBkYXRhSWQsXG4gICAgbGFiZWxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhbmQgZW5kIGZpbHRlciBhbmltYXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZHggb2YgZmlsdGVyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnRvZ2dsZUZpbHRlckFuaW1hdGlvbn1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlRmlsdGVyQW5pbWF0aW9uKGlkeCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OLFxuICAgIGlkeFxuICB9O1xufVxuXG4vKipcbiAqIENoYW5nZSBmaWx0ZXIgYW5pbWF0aW9uIHNwZWVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IC0gIGBpZHhgIG9mIGZpbHRlclxuICogQHBhcmFtIHNwZWVkIC0gYHNwZWVkYCB0byBjaGFuZ2UgaXQgdG8uIGBzcGVlZGAgaXMgYSBtdWx0aXBsaWVyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZChpZHgsIHNwZWVkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVVBEQVRFX0ZJTFRFUl9BTklNQVRJT05fU1BFRUQsXG4gICAgaWR4LFxuICAgIHNwZWVkXG4gIH07XG59XG5cbi8qKlxuICogUmVzZXQgYW5pbWF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gdmFsdWUgLSAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgc2xpZGVyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldExheWVyQW5pbWF0aW9uVGltZX1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TGF5ZXJBbmltYXRpb25UaW1lKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0xBWUVSX0FOSU1BVElPTl9USU1FLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbi8qKlxuICogdXBkYXRlIHRyaXAgbGF5ZXIgYW5pbWF0aW9uIHNwZWVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gc3BlZWQgLSBgc3BlZWRgIHRvIGNoYW5nZSBpdCB0by4gYHNwZWVkYCBpcyBhIG11bHRpcGxpZXJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZH1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZChzcGVlZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9MQVlFUl9BTklNQVRJT05fU1BFRUQsXG4gICAgc3BlZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBzdGFydCBlbmQgZW5kIGxheWVyIGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS50b2dnbGVMYXllckFuaW1hdGlvbn1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlTGF5ZXJBbmltYXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX0xBWUVSX0FOSU1BVElPTlxuICB9O1xufVxuXG4vKipcbiAqIGhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudG9nZ2xlTGF5ZXJBbmltYXRpb25Db250cm9sfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2woKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX0xBWUVSX0FOSU1BVElPTl9DT05UUk9MXG4gIH07XG59XG5cbi8qKlxuICogU2hvdyBsYXJnZXIgdGltZSBmaWx0ZXIgYXQgYm90dG9tIGZvciB0aW1lIHBsYXliYWNrIChhcHBseSB0byB0aW1lIGZpbHRlciBvbmx5KVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCAtIGluZGV4IG9mIGZpbHRlciB0byBlbmxhcmdlXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmVubGFyZ2VGaWx0ZXJ9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVubGFyZ2VGaWx0ZXIoaWR4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuRU5MQVJHRV9GSUxURVIsXG4gICAgaWR4XG4gIH07XG59XG5cbi8qKlxuICogU2hvdy9oaWRlIGZpbHRlciBmZWF0dXJlIG9uIG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCAtIGluZGV4IG9mIGZpbHRlciBmZWF0dXJlIHRvIHNob3cvaGlkZVxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS50b2dnbGVGaWx0ZXJGZWF0dXJlfVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUZpbHRlckZlYXR1cmUoaWR4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX0ZJTFRFUl9GRUFUVVJFLFxuICAgIGlkeFxuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgaG92ZXIgZXZlbnQgd2l0aCBob3ZlcmVkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGluZm8gLSBPYmplY3QgaG92ZXJlZCwgcmV0dXJuZWQgYnkgZGVjay5nbFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5vbkxheWVySG92ZXJ9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uTGF5ZXJIb3ZlcihpbmZvKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfSE9WRVIsXG4gICAgaW5mb1xuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGluZm8gLSBPYmplY3QgY2xpY2tlZCwgcmV0dXJuZWQgYnkgZGVjay5nbFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5vbkxheWVyQ2xpY2t9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uTGF5ZXJDbGljayhpbmZvKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfQ0xJQ0ssXG4gICAgaW5mb1xuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbWFwIGNsaWNrIGV2ZW50LCB1bnNlbGVjdCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5vbk1hcENsaWNrfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbk1hcENsaWNrKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLk1BUF9DTElDS1xuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbWFwIG1vdXNlIG1vdmVldmVudCwgcGF5bG9hZCB3b3VsZCBiZVxuICogUmVhY3QtbWFwLWdsIFBvaW50ZXJFdmVudFxuICogaHR0cHM6Ly91YmVyLmdpdGh1Yi5pby9yZWFjdC1tYXAtZ2wvIy9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcG9pbnRlci1ldmVudFxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBldnQgLSBQb2ludGVyRXZlbnRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykub25Nb3VzZU1vdmV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2dCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLk1PVVNFX01PVkUsXG4gICAgZXZ0XG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIHZpc2liaWxpdHkgb2YgYSBsYXllciBpbiBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIG1hcEluZGV4IC0gaW5kZXggb2YgdGhlIHNwbGl0IG1hcFxuICogQHBhcmFtIGxheWVySWQgLSBpZCBvZiB0aGUgbGF5ZXJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudG9nZ2xlTGF5ZXJGb3JNYXB9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUxheWVyRm9yTWFwKG1hcEluZGV4LCBsYXllcklkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX0xBWUVSX0ZPUl9NQVAsXG4gICAgbWFwSW5kZXgsXG4gICAgbGF5ZXJJZFxuICB9O1xufVxuXG4vKipcbiAqIFNldCB0aGUgcHJvcGVydHkgb2YgYSBmaWx0ZXIgcGxvdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeFxuICogQHBhcmFtIG5ld1Byb3Aga2V5IHZhbHVlIG1hcHBpbmcgb2YgbmV3IHByb3AgYHt5QXhpczogJ2hpc3RvZ3JhbSd9YFxuICogQHBhcmFtIHZhbHVlSW5kZXggZGF0YUlkIGluZGV4XG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldEZpbHRlclBsb3R9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlclBsb3QoaWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0ZJTFRFUl9QTE9ULFxuICAgIGlkeCxcbiAgICBuZXdQcm9wLFxuICAgIHZhbHVlSW5kZXhcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpbmZvXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldE1hcEluZm99XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1hcEluZm8oaW5mbykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9NQVBfSU5GTyxcbiAgICBpbmZvXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZmlsZXMgYXJyYXkgb2YgZmlsZWJsb2JcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubG9hZEZpbGVzfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXMoZmlsZXMsIG9uRmluaXNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTE9BRF9GSUxFUyxcbiAgICBmaWxlcyxcbiAgICBvbkZpbmlzaFxuICB9O1xufVxuXG4vKipcbiAqIENhbGxlZCB3aXRoIG5leHQgZmlsZSB0byBsb2FkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxvYWROZXh0RmlsZX1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZE5leHRGaWxlKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfTkVYVF9GSUxFXG4gIH07XG59XG5cbi8qKlxuICogY2FsbGVkIHdoZW4gYWxsIGZpbGVzIGFyZSBwcm9jZXNzZWQgYW5kIGxvYWRlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIHJlc3VsdFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sb2FkRmlsZXNTdWNjZXNzfVxuICogQHJldHVybnMgYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVNfU1VDQ0VTUyxcbiAgICByZXN1bHRcbiAgfTtcbn1cblxuLyoqXG4gKiBjYWxsZWQgd2hlbiBzdWNjZXNzZnVsbHkgbG9hZGVkIG9uZSBmaWxlLCByZWFkeSB0byBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIHJlc3VsdFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sb2FkRmlsZVN0ZXBTdWNjZXNzfVxuICogQHJldHVybnMgYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZSwgZmlsZUNhY2hlfSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRV9TVEVQX1NVQ0NFU1MsXG4gICAgZmlsZU5hbWUsXG4gICAgZmlsZUNhY2hlXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBsb2FkaW5nIGZpbGUgZXJyb3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSAgZXJyb3JcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubG9hZEZpbGVzRXJyfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTE9BRF9GSUxFU19FUlIsXG4gICAgZmlsZU5hbWUsXG4gICAgZXJyb3JcbiAgfTtcbn1cblxuLyoqXG4gKiBTdG9yZSBmZWF0dXJlcyB0byBzdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGZlYXR1cmVzXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldEZlYXR1cmVzfVxuICogQHJldHVybnMgYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGZWF0dXJlcyhmZWF0dXJlcykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9GRUFUVVJFUyxcbiAgICBmZWF0dXJlc1xuICB9O1xufVxuXG4vKipcbiAqIEl0IHdpbGwgYXBwbHkgdGhlIHByb3ZpZGUgZmVhdHVyZSBhcyBmaWx0ZXIgdG8gdGhlIGdpdmVuIGxheWVyLlxuICogSWYgdGhlIGdpdmVuIGZlYXR1cmUgaXMgYWxyZWFkeSBhcHBsaWVkIGFzIGZpbHRlciB0byB0aGUgbGF5ZXIsIGl0IHdpbGwgcmVtb3ZlIHRoZSBsYXllciBmcm9tIHRoZSBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBsYXllclxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0UG9seWdvbkZpbHRlckxheWVyfVxuICogQHJldHVybnMgYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQb2x5Z29uRmlsdGVyTGF5ZXIobGF5ZXIsIGZlYXR1cmUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfUE9MWUdPTl9GSUxURVJfTEFZRVIsXG4gICAgbGF5ZXIsXG4gICAgZmVhdHVyZVxuICB9O1xufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBmZWF0dXJlIHRvIGJlIGVkaXRlZC9kZWxldGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRTZWxlY3RlZEZlYXR1cmV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGVkRmVhdHVyZShmZWF0dXJlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX1NFTEVDVEVEX0ZFQVRVUkUsXG4gICAgZmVhdHVyZVxuICB9O1xufVxuXG4vKipcbiAqIERlbGV0ZSB0aGUgZ2l2ZW4gZmVhdHVyZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGZlYXR1cmVcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuZGVsZXRlRmVhdHVyZX1cbiAqIEByZXR1cm5zIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmVhdHVyZShmZWF0dXJlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFX0ZFQVRVUkUsXG4gICAgZmVhdHVyZVxuICB9O1xufVxuXG4vKiogU2V0IHRoZSBtYXAgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIG1vZGUgb25lIG9mIEVESVRPUl9NT0RFU1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRFZGl0b3JNb2RlfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtzZXRNYXBNb2RlfSBmcm9tICdrZXBsZXIuZ2wvYWN0aW9ucyc7XG4gKiBpbXBvcnQge0VESVRPUl9NT0RFU30gZnJvbSAna2VwbGVyLmdsL2NvbnN0YW50cyc7XG4gKlxuICogdGhpcy5wcm9wcy5kaXNwYXRjaChzZXRNYXBNb2RlKEVESVRPUl9NT0RFUy5EUkFXX1BPTFlHT04pKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVkaXRvck1vZGUobW9kZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9FRElUT1JfTU9ERSxcbiAgICBtb2RlXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBDUFUgZmlsdGVyIG9mIHNlbGVjdGVkIGRhdGFzZXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBkYXRhSWQgLSBzaW5nbGUgZGF0YUlkIG9yIGFuIGFycmF5IG9mIGRhdGFJZHNcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuYXBwbHlDUFVGaWx0ZXJ9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q1BVRmlsdGVyKGRhdGFJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFQUExZX0NQVV9GSUxURVIsXG4gICAgZGF0YUlkXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGVkaXRvciBsYXllciB2aXNpYmlsaXR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnRvZ2dsZUVkaXRvclZpc2liaWxpdHl9XG4gKiBAcmV0dXJuIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eSgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5UT0dHTEVfRURJVE9SX1ZJU0lCSUxJVFlcbiAgfTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSBuZXh0IGZpbGUgYmF0Y2hcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBwYXlsb2FkIC0gYmF0Y2ggcGF5bG9hZFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5uZXh0RmlsZUJhdGNofVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRGaWxlQmF0Y2gocGF5bG9hZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLk5FWFRfRklMRV9CQVRDSCxcbiAgICBwYXlsb2FkXG4gIH07XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZmlsZSBjb250ZW50XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gcGF5bG9hZCAtIHRoZSBmaWxlIGNvbnRlbnRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykucHJvY2Vzc0ZpbGVDb250ZW50fVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudChwYXlsb2FkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQ0VTU19GSUxFX0NPTlRFTlQsXG4gICAgcGF5bG9hZFxuICB9O1xufVxuXG4vKipcbiAqIFNldCBsYXllciBhbmltYXRpb24gdGltZSBmb3JtYXQgYW5kIHRpbWV6b25lXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gY29uZmlnIC0ge3RpbWVGb3JtYXQ6IHN0cmluZywgdGltZXpvbmU6IHN0cmluZ31cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnfVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZyhjb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfTEFZRVJfQU5JTUFUSU9OX1RJTUVfQ09ORklHLFxuICAgIGNvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFNldCBGaWx0ZXIgYW5pbWF0aW9uIHRpbWUgZm9ybWF0IGFuZCB0aW1lem9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeFxuICogQHBhcmFtIGNvbmZpZ1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnfVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWcoaWR4LCBjb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSX0FOSU1BVElPTl9USU1FX0NPTkZJRyxcbiAgICBpZHgsXG4gICAgY29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBkZWNsYXJhdGlvbiBpcyBuZWVkZWQgdG8gZ3JvdXAgYWN0aW9ucyBpbiBkb2NzXG4gKi9cbi8qKlxuICogQWN0aW9ucyBoYW5kbGVkIG1vc3RseSBieSBgdmlzU3RhdGVgIHJlZHVjZXIuXG4gKiBUaGV5IG1hbmFnZSBob3cgZGF0YSBpcyBwcm9jZXNzZWQsIGZpbHRlcmVkIGFuZCBkaXNwbGF5ZWQgb24gdGhlIG1hcCBieSBvcGVyYXRlcyBvbiBsYXllcnMsXG4gKiBmaWx0ZXJzIGFuZCBpbnRlcmFjdGlvbiBzZXR0aW5ncy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB2aXNTdGF0ZUFjdGlvbnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuIl19
985
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWN0aW9uVHlwZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImxheWVyQ29uZmlnQ2hhbmdlIiwib2xkTGF5ZXIiLCJuZXdDb25maWciLCJ0eXBlIiwiQWN0aW9uVHlwZXMiLCJMQVlFUl9DT05GSUdfQ0hBTkdFIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2UiLCJpZHgiLCJwcm9wIiwidmFsdWUiLCJMQVlFUl9URVhUX0xBQkVMX0NIQU5HRSIsImxheWVyVHlwZUNoYW5nZSIsIm5ld1R5cGUiLCJMQVlFUl9UWVBFX0NIQU5HRSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImNoYW5uZWwiLCJMQVlFUl9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsIm5ld1Zpc0NvbmZpZyIsIkxBWUVSX1ZJU19DT05GSUdfQ0hBTkdFIiwibGF5ZXJDb2xvclVJQ2hhbmdlIiwiTEFZRVJfQ09MT1JfVUlfQ0hBTkdFIiwidXBkYXRlTGF5ZXJCbGVuZGluZyIsIm1vZGUiLCJVUERBVEVfTEFZRVJfQkxFTkRJTkciLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZSIsImNvbmZpZyIsIklOVEVSQUNUSU9OX0NPTkZJR19DSEFOR0UiLCJzZXRGaWx0ZXIiLCJ2YWx1ZUluZGV4IiwiU0VUX0ZJTFRFUiIsInNldEZpbHRlckFuaW1hdGlvblRpbWUiLCJTRVRfRklMVEVSX0FOSU1BVElPTl9USU1FIiwic2V0RmlsdGVyQW5pbWF0aW9uV2luZG93IiwiX3JlZiIsImlkIiwiYW5pbWF0aW9uV2luZG93IiwiU0VUX0ZJTFRFUl9BTklNQVRJT05fV0lORE9XIiwiYWRkRmlsdGVyIiwiZGF0YUlkIiwiQUREX0ZJTFRFUiIsImFkZExheWVyIiwiQUREX0xBWUVSIiwicmVvcmRlckxheWVyIiwib3JkZXIiLCJSRU9SREVSX0xBWUVSIiwicmVtb3ZlRmlsdGVyIiwiUkVNT1ZFX0ZJTFRFUiIsInJlbW92ZUxheWVyIiwiUkVNT1ZFX0xBWUVSIiwiZHVwbGljYXRlTGF5ZXIiLCJEVVBMSUNBVEVfTEFZRVIiLCJyZW1vdmVEYXRhc2V0IiwiUkVNT1ZFX0RBVEFTRVQiLCJzaG93RGF0YXNldFRhYmxlIiwiU0hPV19EQVRBU0VUX1RBQkxFIiwic29ydFRhYmxlQ29sdW1uIiwiY29sdW1uIiwiU09SVF9UQUJMRV9DT0xVTU4iLCJwaW5UYWJsZUNvbHVtbiIsIlBJTl9UQUJMRV9DT0xVTU4iLCJjb3B5VGFibGVDb2x1bW4iLCJDT1BZX1RBQkxFX0NPTFVNTiIsInVwZGF0ZVZpc0RhdGEiLCJkYXRhc2V0cyIsIm9wdGlvbnMiLCJVUERBVEVfVklTX0RBVEEiLCJyZW5hbWVEYXRhc2V0IiwibGFiZWwiLCJSRU5BTUVfREFUQVNFVCIsInRvZ2dsZUZpbHRlckFuaW1hdGlvbiIsIlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OIiwidXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWQiLCJzcGVlZCIsIlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVEIiwic2V0TGF5ZXJBbmltYXRpb25UaW1lIiwiU0VUX0xBWUVSX0FOSU1BVElPTl9USU1FIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZCIsIlVQREFURV9MQVlFUl9BTklNQVRJT05fU1BFRUQiLCJ0b2dnbGVMYXllckFuaW1hdGlvbiIsIlRPR0dMRV9MQVlFUl9BTklNQVRJT04iLCJ0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2wiLCJUT0dHTEVfTEFZRVJfQU5JTUFUSU9OX0NPTlRST0wiLCJlbmxhcmdlRmlsdGVyIiwiRU5MQVJHRV9GSUxURVIiLCJ0b2dnbGVGaWx0ZXJGZWF0dXJlIiwiVE9HR0xFX0ZJTFRFUl9GRUFUVVJFIiwib25MYXllckhvdmVyIiwiaW5mbyIsIkxBWUVSX0hPVkVSIiwib25MYXllckNsaWNrIiwiTEFZRVJfQ0xJQ0siLCJvbk1hcENsaWNrIiwiTUFQX0NMSUNLIiwib25Nb3VzZU1vdmUiLCJldnQiLCJNT1VTRV9NT1ZFIiwidG9nZ2xlTGF5ZXJGb3JNYXAiLCJtYXBJbmRleCIsImxheWVySWQiLCJUT0dHTEVfTEFZRVJfRk9SX01BUCIsInNldEZpbHRlclBsb3QiLCJuZXdQcm9wIiwiU0VUX0ZJTFRFUl9QTE9UIiwic2V0TWFwSW5mbyIsIlNFVF9NQVBfSU5GTyIsImxvYWRGaWxlcyIsImZpbGVzIiwib25GaW5pc2giLCJMT0FEX0ZJTEVTIiwibG9hZE5leHRGaWxlIiwiTE9BRF9ORVhUX0ZJTEUiLCJsb2FkRmlsZXNTdWNjZXNzIiwicmVzdWx0IiwiTE9BRF9GSUxFU19TVUNDRVNTIiwibG9hZEZpbGVTdGVwU3VjY2VzcyIsIl9yZWYyIiwiZmlsZU5hbWUiLCJmaWxlQ2FjaGUiLCJMT0FEX0ZJTEVfU1RFUF9TVUNDRVNTIiwibG9hZEZpbGVzRXJyIiwiZXJyb3IiLCJMT0FEX0ZJTEVTX0VSUiIsInNldEZlYXR1cmVzIiwiZmVhdHVyZXMiLCJTRVRfRkVBVFVSRVMiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXIiLCJsYXllciIsImZlYXR1cmUiLCJTRVRfUE9MWUdPTl9GSUxURVJfTEFZRVIiLCJzZXRTZWxlY3RlZEZlYXR1cmUiLCJTRVRfU0VMRUNURURfRkVBVFVSRSIsImRlbGV0ZUZlYXR1cmUiLCJERUxFVEVfRkVBVFVSRSIsInNldEVkaXRvck1vZGUiLCJTRVRfRURJVE9SX01PREUiLCJhcHBseUNQVUZpbHRlciIsIkFQUExZX0NQVV9GSUxURVIiLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5IiwiVE9HR0xFX0VESVRPUl9WSVNJQklMSVRZIiwibmV4dEZpbGVCYXRjaCIsInBheWxvYWQiLCJORVhUX0ZJTEVfQkFUQ0giLCJwcm9jZXNzRmlsZUNvbnRlbnQiLCJQUk9DRVNTX0ZJTEVfQ09OVEVOVCIsInNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZyIsIlNFVF9MQVlFUl9BTklNQVRJT05fVElNRV9DT05GSUciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIiwiU0VUX0ZJTFRFUl9BTklNQVRJT05fVElNRV9DT05GSUciLCJ2aXNTdGF0ZUFjdGlvbnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWN0aW9ucy92aXMtc3RhdGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vLyB2aXMtc3RhdGUtcmVkdWNlclxuaW1wb3J0IEFjdGlvblR5cGVzIGZyb20gJ2NvbnN0YW50cy9hY3Rpb24tdHlwZXMnO1xuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBiYXNlIGNvbmZpZzogZGF0YUlkLCBsYWJlbCwgY29sdW1uLCBpc1Zpc2libGVcbiAqIEBwYXJhbSBvbGRMYXllciAtIGxheWVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBuZXdDb25maWcgLSBuZXcgY29uZmlnIHRvIGJlIG1lcmdlZCB3aXRoIG9sZCBjb25maWdcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sYXllckNvbmZpZ0NoYW5nZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBuZXdDb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciB0ZXh0IGxhYmVsXG4gKiBAcGFyYW0gb2xkTGF5ZXIgLSBsYXllciB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gaWR4IC1gaWR4YCBvZiB0ZXh0IGxhYmVsIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBwcm9wIC0gYHByb3BgIG9mIHRleHQgbGFiZWwsIGUsZywgYGFuY2hvcmAsIGBhbGlnbm1lbnRgLCBgY29sb3JgLCBgc2l6ZWAsIGBmaWVsZGBcbiAqIEBwYXJhbSB2YWx1ZSAtIG5ldyB2YWx1ZVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxheWVyVGV4dExhYmVsQ2hhbmdlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUZXh0TGFiZWxDaGFuZ2Uob2xkTGF5ZXIsIGlkeCwgcHJvcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9URVhUX0xBQkVMX0NIQU5HRSxcbiAgICBvbGRMYXllcixcbiAgICBpZHgsXG4gICAgcHJvcCxcbiAgICB2YWx1ZVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciB0eXBlLiBQcmV2aWV3cyBsYXllciBjb25maWcgd2lsbCBiZSBjb3BpZWQgaWYgYXBwbGljYWJsZS5cbiAqIEBwYXJhbSBvbGRMYXllciAtIGxheWVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBuZXdUeXBlIC0gbmV3IHR5cGVcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sYXllclR5cGVDaGFuZ2V9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld1R5cGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9UWVBFX0NIQU5HRSxcbiAgICBvbGRMYXllcixcbiAgICBuZXdUeXBlXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHZpc3VhbCBjaGFubmVsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gb2xkTGF5ZXIgLSBsYXllciB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gbmV3Q29uZmlnIC0gbmV3IHZpc3VhbCBjaGFubmVsIGNvbmZpZ1xuICogQHBhcmFtIGNoYW5uZWwgLSBjaGFubmVsIHRvIGJlIHVwZGF0ZWRcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2V9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2Uob2xkTGF5ZXIsIG5ld0NvbmZpZywgY2hhbm5lbCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSxcbiAgICBvbGRMYXllcixcbiAgICBuZXdDb25maWcsXG4gICAgY2hhbm5lbFxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBgdmlzQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIG9sZExheWVyIC0gbGF5ZXIgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIG5ld1Zpc0NvbmZpZyAtIG5ldyB2aXNDb25maWcgYXMgYSBrZXkgdmFsdWUgbWFwOiBlLmcuIGB7b3BhY2l0eTogMC44fWBcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sYXllclZpc0NvbmZpZ0NoYW5nZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBuZXdWaXNDb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9WSVNfQ09ORklHX0NIQU5HRSxcbiAgICBvbGRMYXllcixcbiAgICBuZXdWaXNDb25maWdcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbG9yIHBhbGV0dGUgdWkgZm9yIGxheWVyIGNvbG9yXG4gKiBAbWVtYmVyT2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gb2xkTGF5ZXIgLSBsYXllciB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gcHJvcCAtIHdoaWNoIGNvbG9yIHByb3BcbiAqIEBwYXJhbSBuZXdDb25maWcgLSB0byBiZSBtZXJnZWRcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sYXllckNvbG9yVUlDaGFuZ2V9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbG9yVUlDaGFuZ2Uob2xkTGF5ZXIsIHByb3AsIG5ld0NvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX0NPTE9SX1VJX0NIQU5HRSxcbiAgICBvbGRMYXllcixcbiAgICBwcm9wLFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBibGVuZGluZyBtb2RlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gbW9kZSBvbmUgb2YgYGFkZGl0aXZlYCwgYG5vcm1hbGAgYW5kIGBzdWJ0cmFjdGl2ZWBcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS51cGRhdGVMYXllckJsZW5kaW5nfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGF5ZXJCbGVuZGluZyhtb2RlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVVBEQVRFX0xBWUVSX0JMRU5ESU5HLFxuICAgIG1vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYGludGVyYWN0aW9uQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGNvbmZpZyAtIG5ldyBjb25maWcgYXMga2V5IHZhbHVlIG1hcDogYHt0b29sdGlwOiB7ZW5hYmxlZDogdHJ1ZX19YFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmludGVyYWN0aW9uQ29uZmlnQ2hhbmdlfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJhY3Rpb25Db25maWdDaGFuZ2UoY29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5URVJBQ1RJT05fQ09ORklHX0NIQU5HRSxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IC1gaWR4YCBvZiBmaWx0ZXIgdG8gYmUgdXBkYXRlZFxuICogQHBhcmFtIHByb3AgLSBgcHJvcGAgb2YgZmlsdGVyLCBlLGcsIGBkYXRhSWRgLCBgbmFtZWAsIGB2YWx1ZWBcbiAqIEBwYXJhbSB2YWx1ZSAtIG5ldyB2YWx1ZVxuICogQHBhcmFtIHZhbHVlSW5kZXggLSBkYXRhSWQgaW5kZXhcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGaWx0ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXIoaWR4LCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9GSUxURVIsXG4gICAgaWR4LFxuICAgIHByb3AsXG4gICAgdmFsdWUsXG4gICAgdmFsdWVJbmRleFxuICB9O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgVXBkYXRlIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCAtYGlkeGAgb2YgZmlsdGVyIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBwcm9wIC0gYHByb3BgIG9mIGZpbHRlciwgZSxnLCBgZGF0YUlkYCwgYG5hbWVgLCBgdmFsdWVgXG4gKiBAcGFyYW0gdmFsdWUgLSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB2YWx1ZUluZGV4IC0gZGF0YUlkIGluZGV4XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0RmlsdGVyQW5pbWF0aW9uVGltZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWUoaWR4LCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9GSUxURVJfQU5JTUFUSU9OX1RJTUUsXG4gICAgaWR4LFxuICAgIHByb3AsXG4gICAgdmFsdWUsXG4gICAgdmFsdWVJbmRleFxuICB9O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgVXBkYXRlIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGaWx0ZXJBbmltYXRpb25XaW5kb3d9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3coe2lkLCBhbmltYXRpb25XaW5kb3d9KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0ZJTFRFUl9BTklNQVRJT05fV0lORE9XLFxuICAgIGlkLFxuICAgIGFuaW1hdGlvbldpbmRvd1xuICB9O1xufVxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZGF0YUlkIC0gZGF0YXNldCBgaWRgIHRoaXMgbmV3IGZpbHRlciBpcyBhc3NvY2lhdGVkIHdpdGhcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5hZGRGaWx0ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWx0ZXIoZGF0YUlkKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuQUREX0ZJTFRFUixcbiAgICBkYXRhSWRcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBjb25maWcgLSBuZXcgbGF5ZXIgY29uZmlnXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuYWRkTGF5ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRMYXllcihjb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5BRERfTEFZRVIsXG4gICAgY29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogUmVvcmRlciBsYXllciwgb3JkZXIgaXMgYW4gYXJyYXkgb2YgbGF5ZXIgaW5kZXhlcywgaW5kZXggMCB3aWxsIGJlIHRoZSBvbmUgYXQgdGhlIGJvdHRvbVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIG9yZGVyIGFuIGFycmF5IG9mIGxheWVyIGluZGV4ZXNcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5yZW9yZGVyTGF5ZXJ9XG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIGJyaW5nIGBsYXllcnNbMV1gIGJlbG93IGBsYXllcnNbMF1gLCB0aGUgc2VxdWVuY2UgbGF5ZXJzIHdpbGwgYmUgcmVuZGVyZWQgaXMgYDFgLCBgMGAsIGAyYCwgYDNgLlxuICogLy8gYDFgIHdpbGwgYmUgYXQgdGhlIGJvdHRvbSwgYDNgIHdpbGwgYmUgYXQgdGhlIHRvcC5cbiAqIHRoaXMucHJvcHMuZGlzcGF0Y2gocmVvcmRlckxheWVyKFsxLCAwLCAyLCAzXSkpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlckxheWVyKG9yZGVyKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVPUkRFUl9MQVlFUixcbiAgICBvcmRlclxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGZpbHRlciBmcm9tIGB2aXNTdGF0ZS5maWx0ZXJzYCwgb25jZSBhIGZpbHRlciBpcyByZW1vdmVkLCBkYXRhIHdpbGwgYmUgcmUtZmlsdGVyZWQgYW5kIGxheWVyIHdpbGwgYmUgdXBkYXRlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCBpZHggb2YgZmlsdGVyIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5yZW1vdmVGaWx0ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGaWx0ZXIoaWR4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVNT1ZFX0ZJTFRFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCBpZHggb2YgbGF5ZXIgdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnJlbW92ZUxheWVyfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGF5ZXIoaWR4KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVNT1ZFX0xBWUVSLFxuICAgIGlkeFxuICB9O1xufVxuXG4vKipcbiAqIER1cGxpY2F0ZSBhIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaWR4IGlkeCBvZiBsYXllciB0byBiZSBkdXBsaWNhdGVkXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuZHVwbGljYXRlTGF5ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXBsaWNhdGVMYXllcihpZHgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5EVVBMSUNBVEVfTEFZRVIsXG4gICAgaWR4XG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBkYXRhSWQgZGF0YXNldCBpZFxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnJlbW92ZURhdGFzZXR9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0KGRhdGFJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFTU9WRV9EQVRBU0VULFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqIERpc3BsYXkgZGF0YXNldCB0YWJsZSBpbiBhIG1vZGFsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZGF0YUlkIGRhdGFzZXQgaWQgdG8gc2hvdyBpbiB0YWJsZVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNob3dEYXRhc2V0VGFibGV9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG93RGF0YXNldFRhYmxlKGRhdGFJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNIT1dfREFUQVNFVF9UQUJMRSxcbiAgICBkYXRhSWRcbiAgfTtcbn1cblxuLyoqXG4gKiBTb3J0IGRhdGFzZXQgY29sdW1uLCBmb3IgdGFibGUgZGlzcGxheVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGRhdGFJZFxuICogQHBhcmFtIGNvbHVtblxuICogQHBhcmFtIG1vZGVcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zb3J0VGFibGVDb2x1bW59XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VGFibGVDb2x1bW4oZGF0YUlkLCBjb2x1bW4sIG1vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TT1JUX1RBQkxFX0NPTFVNTixcbiAgICBkYXRhSWQsXG4gICAgY29sdW1uLFxuICAgIG1vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBQaW4gZGF0YXNldCBjb2x1bW4sIGZvciB0YWJsZSBkaXNwbGF5XG4gKiBAcGFyYW0gZGF0YUlkXG4gKiBAcGFyYW0gY29sdW1uXG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykucGluVGFibGVDb2x1bW59XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaW5UYWJsZUNvbHVtbihkYXRhSWQsIGNvbHVtbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlBJTl9UQUJMRV9DT0xVTU4sXG4gICAgZGF0YUlkLFxuICAgIGNvbHVtblxuICB9O1xufVxuXG4vKipcbiAqIENvcHkgY29sdW1uLCBmb3IgdGFibGUgZGlzcGxheVxuICogQHBhcmFtIGRhdGFJZFxuICogQHBhcmFtIGNvbHVtblxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmNvcHlUYWJsZUNvbHVtbn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlUYWJsZUNvbHVtbihkYXRhSWQsIGNvbHVtbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkNPUFlfVEFCTEVfQ09MVU1OLFxuICAgIGRhdGFJZCxcbiAgICBjb2x1bW5cbiAgfTtcbn1cblxuLy8gKiBAcGFyYW0gZGF0YXNldC5pbmZvIC1pbmZvIG9mIGEgZGF0YXNldFxuLy8gKiBAcGFyYW0gZGF0YXNldC5pbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuLy8gKiBAcGFyYW0gZGF0YXNldC5pbmZvLmxhYmVsIC0gQSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBkYXRhc2V0XG4vLyAqIEBwYXJhbSBkYXRhc2V0LmRhdGEgLSAqKipyZXF1aXJlZCoqIFRoZSBkYXRhIG9iamVjdCwgaW4gYSB0YWJ1bGFyIGZvcm1hdCB3aXRoIDIgcHJvcGVydGllcyBgZmllbGRzYCBhbmQgYHJvd3NgXG4vLyAqIEBwYXJhbSBkYXRhc2V0LmRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4vLyAqIEBwYXJhbSBkYXRhc2V0LmRhdGEuZmllbGRzLm5hbWUgLSAqKipyZXF1aXJlZCoqIE5hbWUgb2YgdGhlIGZpZWxkLFxuLy8gKiBAcGFyYW0gZGF0YXNldC5kYXRhLnJvd3MgLSAqKipyZXF1aXJlZCoqIEFycmF5IG9mIHJvd3MsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCBgZmllbGRzYCBhbmQgYHJvd3NgXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGRhdGFzZXRzIC0gKioqcmVxdWlyZWQqKiBkYXRhc2V0cyBjYW4gYmUgYSBkYXRhc2V0IG9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKiBFYWNoIGRhdGFzZXQgb2JqZWN0IG5lZWRzIHRvIGhhdmUgYGluZm9gIGFuZCBgZGF0YWAgcHJvcGVydHkuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2VudGVyTWFwIGBkZWZhdWx0OiB0cnVlYCBpZiBgY2VudGVyTWFwYCBpcyBzZXQgdG8gYHRydWVgIGtlcGxlci5nbCB3aWxsXG4gKiBwbGFjZSB0aGUgbWFwIHZpZXcgd2l0aGluIHRoZSBkYXRhIHBvaW50cyBib3VuZGFyaWVzXG4gKiBAcGFyYW0gb3B0aW9ucy5yZWFkT25seSBgZGVmYXVsdDogZmFsc2VgIGlmIGByZWFkT25seWAgaXMgc2V0IHRvIGB0cnVlYFxuICogdGhlIGxlZnQgc2V0dGluZyBwYW5lbCB3aWxsIGJlIGhpZGRlblxuICogQHBhcmFtIGNvbmZpZyB0aGlzIG9iamVjdCB3aWxsIGNvbnRhaW4gdGhlIGZ1bGwga2VwbGVyLmdsIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24ge21hcFN0YXRlLCBtYXBTdHlsZSwgdmlzU3RhdGV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudXBkYXRlVmlzRGF0YX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpc0RhdGEoZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9WSVNfREFUQSxcbiAgICBkYXRhc2V0cyxcbiAgICBvcHRpb25zLFxuICAgIGNvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFJlbmFtZSBhbiBleGlzdGluZyBkYXRhc2V0IGluIGB2aXNTdGF0ZWBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBkYXRhSWQgLSAqKipyZXF1aXJlZCoqIElkIG9mIHRoZSBkYXRhc2V0IHRvIHVwZGF0ZVxuICogQHBhcmFtIGxhYmVsIC0gKioqcmVxdWlyZWQqKiBOZXcgbmFtZSBmb3IgdGhlIGRhdGFzZXRcbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5yZW5hbWVEYXRhc2V0fVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRGF0YXNldChkYXRhSWQsIGxhYmVsKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVOQU1FX0RBVEFTRVQsXG4gICAgZGF0YUlkLFxuICAgIGxhYmVsXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYW5kIGVuZCBmaWx0ZXIgYW5pbWF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0ge051bWJlcn0gaWR4IG9mIGZpbHRlclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS50b2dnbGVGaWx0ZXJBbmltYXRpb259XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUZpbHRlckFuaW1hdGlvbihpZHgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5UT0dHTEVfRklMVEVSX0FOSU1BVElPTixcbiAgICBpZHhcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZmlsdGVyIGFuaW1hdGlvbiBzcGVlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGlkeCAtICBgaWR4YCBvZiBmaWx0ZXJcbiAqIEBwYXJhbSBzcGVlZCAtIGBzcGVlZGAgdG8gY2hhbmdlIGl0IHRvLiBgc3BlZWRgIGlzIGEgbXVsdGlwbGllclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS51cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZH1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWQoaWR4LCBzcGVlZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVELFxuICAgIGlkeCxcbiAgICBzcGVlZFxuICB9O1xufVxuXG4vKipcbiAqIFJlc2V0IGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIHZhbHVlIC0gIEN1cnJlbnQgdmFsdWUgb2YgdGhlIHNsaWRlclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRMYXllckFuaW1hdGlvblRpbWV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheWVyQW5pbWF0aW9uVGltZSh2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9MQVlFUl9BTklNQVRJT05fVElNRSxcbiAgICB2YWx1ZVxuICB9O1xufVxuXG4vKipcbiAqIHVwZGF0ZSB0cmlwIGxheWVyIGFuaW1hdGlvbiBzcGVlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIHNwZWVkIC0gYHNwZWVkYCB0byBjaGFuZ2UgaXQgdG8uIGBzcGVlZGAgaXMgYSBtdWx0aXBsaWVyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWR9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWQoc3BlZWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfTEFZRVJfQU5JTUFUSU9OX1NQRUVELFxuICAgIHNwZWVkXG4gIH07XG59XG5cbi8qKlxuICogc3RhcnQgZW5kIGVuZCBsYXllciBhbmltYXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudG9nZ2xlTGF5ZXJBbmltYXRpb259XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUxheWVyQW5pbWF0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9MQVlFUl9BTklNQVRJT05cbiAgfTtcbn1cblxuLyoqXG4gKiBoaWRlIGFuZCBzaG93IGxheWVyIGFuaW1hdGlvbiBjb250cm9sXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbH1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlTGF5ZXJBbmltYXRpb25Db250cm9sKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9MQVlFUl9BTklNQVRJT05fQ09OVFJPTFxuICB9O1xufVxuXG4vKipcbiAqIFNob3cgbGFyZ2VyIHRpbWUgZmlsdGVyIGF0IGJvdHRvbSBmb3IgdGltZSBwbGF5YmFjayAoYXBwbHkgdG8gdGltZSBmaWx0ZXIgb25seSlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBmaWx0ZXIgdG8gZW5sYXJnZVxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5lbmxhcmdlRmlsdGVyfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmxhcmdlRmlsdGVyKGlkeCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkVOTEFSR0VfRklMVEVSLFxuICAgIGlkeFxuICB9O1xufVxuXG4vKipcbiAqIFNob3cvaGlkZSBmaWx0ZXIgZmVhdHVyZSBvbiBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBmaWx0ZXIgZmVhdHVyZSB0byBzaG93L2hpZGVcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykudG9nZ2xlRmlsdGVyRmVhdHVyZX1cbiAqIEByZXR1cm4gYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVGaWx0ZXJGZWF0dXJlKGlkeCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9GSUxURVJfRkVBVFVSRSxcbiAgICBpZHhcbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGxheWVyIGhvdmVyIGV2ZW50IHdpdGggaG92ZXJlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpbmZvIC0gT2JqZWN0IGhvdmVyZWQsIHJldHVybmVkIGJ5IGRlY2suZ2xcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykub25MYXllckhvdmVyfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxheWVySG92ZXIoaW5mbykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX0hPVkVSLFxuICAgIGluZm9cbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGxheWVyIGNsaWNrIGV2ZW50IHdpdGggY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpbmZvIC0gT2JqZWN0IGNsaWNrZWQsIHJldHVybmVkIGJ5IGRlY2suZ2xcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykub25MYXllckNsaWNrfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxheWVyQ2xpY2soaW5mbykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX0NMSUNLLFxuICAgIGluZm9cbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykub25NYXBDbGlja31cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25NYXBDbGljaygpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5NQVBfQ0xJQ0tcbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBtb3VzZSBtb3ZlZXZlbnQsIHBheWxvYWQgd291bGQgYmVcbiAqIFJlYWN0LW1hcC1nbCBQb2ludGVyRXZlbnRcbiAqIGh0dHBzOi8vdWJlci5naXRodWIuaW8vcmVhY3QtbWFwLWdsLyMvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BvaW50ZXItZXZlbnRcbiAqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZXZ0IC0gUG9pbnRlckV2ZW50XG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLm9uTW91c2VNb3ZlfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdXNlTW92ZShldnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5NT1VTRV9NT1ZFLFxuICAgIGV2dFxuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGEgbGF5ZXIgaW4gYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBtYXBJbmRleCAtIGluZGV4IG9mIHRoZSBzcGxpdCBtYXBcbiAqIEBwYXJhbSBsYXllcklkIC0gaWQgb2YgdGhlIGxheWVyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnRvZ2dsZUxheWVyRm9yTWFwfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVMYXllckZvck1hcChtYXBJbmRleCwgbGF5ZXJJZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9MQVlFUl9GT1JfTUFQLFxuICAgIG1hcEluZGV4LFxuICAgIGxheWVySWRcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHhcbiAqIEBwYXJhbSBuZXdQcm9wIGtleSB2YWx1ZSBtYXBwaW5nIG9mIG5ldyBwcm9wIGB7eUF4aXM6ICdoaXN0b2dyYW0nfWBcbiAqIEBwYXJhbSB2YWx1ZUluZGV4IGRhdGFJZCBpbmRleFxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGaWx0ZXJQbG90fVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJQbG90KGlkeCwgbmV3UHJvcCwgdmFsdWVJbmRleCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9GSUxURVJfUExPVCxcbiAgICBpZHgsXG4gICAgbmV3UHJvcCxcbiAgICB2YWx1ZUluZGV4XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHRoZSBwcm9wZXJ0eSBvZiBhIGZpbHRlciBwbG90XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gaW5mb1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRNYXBJbmZvfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXBJbmZvKGluZm8pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfTUFQX0lORk8sXG4gICAgaW5mb1xuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgZmlsZSBsb2FkaW5nIGRpc3BhdGNoIGBhZGREYXRhVG9NYXBgIGlmIHN1Y2NlZWQsIG9yIGBsb2FkRmlsZXNFcnJgIGlmIGZhaWxlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGZpbGVzIGFycmF5IG9mIGZpbGVibG9iXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxvYWRGaWxlc31cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzKGZpbGVzLCBvbkZpbmlzaCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVMsXG4gICAgZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgd2l0aCBuZXh0IGZpbGUgdG8gbG9hZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5sb2FkTmV4dEZpbGV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWROZXh0RmlsZSgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0FEX05FWFRfRklMRVxuICB9O1xufVxuXG4vKipcbiAqIGNhbGxlZCB3aGVuIGFsbCBmaWxlcyBhcmUgcHJvY2Vzc2VkIGFuZCBsb2FkZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSByZXN1bHRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubG9hZEZpbGVzU3VjY2Vzc31cbiAqIEByZXR1cm5zIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzU3VjY2VzcyhyZXN1bHQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0FEX0ZJTEVTX1NVQ0NFU1MsXG4gICAgcmVzdWx0XG4gIH07XG59XG5cbi8qKlxuICogY2FsbGVkIHdoZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgcmVhZHkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSByZXN1bHRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubG9hZEZpbGVTdGVwU3VjY2Vzc31cbiAqIEByZXR1cm5zIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVTdGVwU3VjY2Vzcyh7ZmlsZU5hbWUsIGZpbGVDYWNoZX0pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0FEX0ZJTEVfU1RFUF9TVUNDRVNTLFxuICAgIGZpbGVOYW1lLFxuICAgIGZpbGVDYWNoZVxuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbG9hZGluZyBmaWxlIGVycm9yXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gIGVycm9yXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmxvYWRGaWxlc0Vycn1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVNfRVJSLFxuICAgIGZpbGVOYW1lLFxuICAgIGVycm9yXG4gIH07XG59XG5cbi8qKlxuICogU3RvcmUgZmVhdHVyZXMgdG8gc3RhdGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBmZWF0dXJlc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS5zZXRGZWF0dXJlc31cbiAqIEByZXR1cm5zIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXMoZmVhdHVyZXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRkVBVFVSRVMsXG4gICAgZmVhdHVyZXNcbiAgfTtcbn1cblxuLyoqXG4gKiBJdCB3aWxsIGFwcGx5IHRoZSBwcm92aWRlIGZlYXR1cmUgYXMgZmlsdGVyIHRvIHRoZSBnaXZlbiBsYXllci5cbiAqIElmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIGFscmVhZHkgYXBwbGllZCBhcyBmaWx0ZXIgdG8gdGhlIGxheWVyLCBpdCB3aWxsIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gbGF5ZXJcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldFBvbHlnb25GaWx0ZXJMYXllcn1cbiAqIEByZXR1cm5zIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9seWdvbkZpbHRlckxheWVyKGxheWVyLCBmZWF0dXJlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX1BPTFlHT05fRklMVEVSX0xBWUVSLFxuICAgIGxheWVyLFxuICAgIGZlYXR1cmVcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgZmVhdHVyZSB0byBiZSBlZGl0ZWQvZGVsZXRlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGZlYXR1cmVcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0U2VsZWN0ZWRGZWF0dXJlfVxuICogQHJldHVybnMgYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3RlZEZlYXR1cmUoZmVhdHVyZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9TRUxFQ1RFRF9GRUFUVVJFLFxuICAgIGZlYXR1cmVcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWxldGUgdGhlIGdpdmVuIGZlYXR1cmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmRlbGV0ZUZlYXR1cmV9XG4gKiBAcmV0dXJucyBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmUoZmVhdHVyZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkRFTEVURV9GRUFUVVJFLFxuICAgIGZlYXR1cmVcbiAgfTtcbn1cblxuLyoqIFNldCB0aGUgbWFwIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBtb2RlIG9uZSBvZiBFRElUT1JfTU9ERVNcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0RWRpdG9yTW9kZX1cbiAqIEByZXR1cm5zIGFjdGlvblxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7c2V0TWFwTW9kZX0gZnJvbSAna2VwbGVyLmdsL2FjdGlvbnMnO1xuICogaW1wb3J0IHtFRElUT1JfTU9ERVN9IGZyb20gJ2tlcGxlci5nbC9jb25zdGFudHMnO1xuICpcbiAqIHRoaXMucHJvcHMuZGlzcGF0Y2goc2V0TWFwTW9kZShFRElUT1JfTU9ERVMuRFJBV19QT0xZR09OKSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFZGl0b3JNb2RlKG1vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRURJVE9SX01PREUsXG4gICAgbW9kZVxuICB9O1xufVxuXG4vKipcbiAqIFRyaWdnZXIgQ1BVIGZpbHRlciBvZiBzZWxlY3RlZCBkYXRhc2V0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gZGF0YUlkIC0gc2luZ2xlIGRhdGFJZCBvciBhbiBhcnJheSBvZiBkYXRhSWRzXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLmFwcGx5Q1BVRmlsdGVyfVxuICogQHJldHVybnMgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUNQVUZpbHRlcihkYXRhSWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5BUFBMWV9DUFVfRklMVEVSLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBlZGl0b3IgbGF5ZXIgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vdmlzLXN0YXRlLWFjdGlvbnMnKS50b2dnbGVFZGl0b3JWaXNpYmlsaXR5fVxuICogQHJldHVybiBhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUVkaXRvclZpc2liaWxpdHkoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX0VESVRPUl9WSVNJQklMSVRZXG4gIH07XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgbmV4dCBmaWxlIGJhdGNoXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVBY3Rpb25zXG4gKiBAcGFyYW0gcGF5bG9hZCAtIGJhdGNoIHBheWxvYWRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykubmV4dEZpbGVCYXRjaH1cbiAqIEByZXR1cm4gYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0RmlsZUJhdGNoKHBheWxvYWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5ORVhUX0ZJTEVfQkFUQ0gsXG4gICAgcGF5bG9hZFxuICB9O1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIGZpbGUgY29udGVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIHBheWxvYWQgLSB0aGUgZmlsZSBjb250ZW50XG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnByb2Nlc3NGaWxlQ29udGVudH1cbiAqIEByZXR1cm4gYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZUNvbnRlbnQocGF5bG9hZCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0NFU1NfRklMRV9DT05URU5ULFxuICAgIHBheWxvYWRcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgbGF5ZXIgYW5pbWF0aW9uIHRpbWUgZm9ybWF0IGFuZCB0aW1lem9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlQWN0aW9uc1xuICogQHBhcmFtIGNvbmZpZyAtIHt0aW1lRm9ybWF0OiBzdHJpbmcsIHRpbWV6b25lOiBzdHJpbmd9XG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnLi92aXMtc3RhdGUtYWN0aW9ucycpLnNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ31cbiAqIEByZXR1cm4gYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcoY29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0xBWUVSX0FOSU1BVElPTl9USU1FX0NPTkZJRyxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXQgRmlsdGVyIGFuaW1hdGlvbiB0aW1lIGZvcm1hdCBhbmQgdGltZXpvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZUFjdGlvbnNcbiAqIEBwYXJhbSBpZHhcbiAqIEBwYXJhbSBjb25maWdcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3Zpcy1zdGF0ZS1hY3Rpb25zJykuc2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ31cbiAqIEByZXR1cm4gYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnKGlkeCwgY29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX0ZJTFRFUl9BTklNQVRJT05fVElNRV9DT05GSUcsXG4gICAgaWR4LFxuICAgIGNvbmZpZ1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZGVjbGFyYXRpb24gaXMgbmVlZGVkIHRvIGdyb3VwIGFjdGlvbnMgaW4gZG9jc1xuICovXG4vKipcbiAqIEFjdGlvbnMgaGFuZGxlZCBtb3N0bHkgYnkgYHZpc1N0YXRlYCByZWR1Y2VyLlxuICogVGhleSBtYW5hZ2UgaG93IGRhdGEgaXMgcHJvY2Vzc2VkLCBmaWx0ZXJlZCBhbmQgZGlzcGxheWVkIG9uIHRoZSBtYXAgYnkgb3BlcmF0ZXMgb24gbGF5ZXJzLFxuICogZmlsdGVycyBhbmQgaW50ZXJhY3Rpb24gc2V0dGluZ3MuXG4gKlxuICogQHB1YmxpY1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdmlzU3RhdGVBY3Rpb25zID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQSxJQUFBQSxZQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGlCQUFpQkEsQ0FBQ0MsUUFBUSxFQUFFQyxTQUFTLEVBQUU7RUFDckQsT0FBTztJQUNMQyxJQUFJLEVBQUVDLHVCQUFXLENBQUNDLG1CQUFtQjtJQUNyQ0osUUFBUSxFQUFSQSxRQUFRO0lBQ1JDLFNBQVMsRUFBVEE7RUFDRixDQUFDO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxvQkFBb0JBLENBQUNMLFFBQVEsRUFBRU0sR0FBRyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRTtFQUMvRCxPQUFPO0lBQ0xOLElBQUksRUFBRUMsdUJBQVcsQ0FBQ00sdUJBQXVCO0lBQ3pDVCxRQUFRLEVBQVJBLFFBQVE7SUFDUk0sR0FBRyxFQUFIQSxHQUFHO0lBQ0hDLElBQUksRUFBSkEsSUFBSTtJQUNKQyxLQUFLLEVBQUxBO0VBQ0YsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxl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