@windborne/grapher 1.0.19 → 1.0.21

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 (227) hide show
  1. package/dist/744.bundle.cjs +1 -2
  2. package/dist/744.bundle.esm.js +1 -2
  3. package/dist/bundle.cjs +1 -1
  4. package/dist/bundle.cjs.map +1 -1
  5. package/dist/bundle.esm.js +1 -1
  6. package/dist/bundle.esm.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/index.d.ts +19 -1
  9. package/src/index.js +3 -1
  10. package/src/index.mjs +3 -2
  11. package/src/rust/Cargo.lock +1 -1
  12. package/src/rust/pkg/index.js +0 -397
  13. package/src/rust/pkg/index_bg.wasm +0 -0
  14. package/src/state/state_controller.js +1 -1
  15. package/dist/744.bundle.cjs.map +0 -1
  16. package/dist/744.bundle.esm.js.map +0 -1
  17. package/dist/c83ea4ee006f636782a7.wasm +0 -0
  18. package/src/rust/target/.rustc_info.json +0 -1
  19. package/src/rust/target/CACHEDIR.TAG +0 -3
  20. package/src/rust/target/release/.cargo-lock +0 -0
  21. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/dep-lib-bumpalo +0 -0
  22. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/invoked.timestamp +0 -1
  23. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/lib-bumpalo +0 -1
  24. package/src/rust/target/release/.fingerprint/bumpalo-952aca385c0ec8c7/lib-bumpalo.json +0 -1
  25. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/dep-lib-cfg_if +0 -0
  26. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/invoked.timestamp +0 -1
  27. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/lib-cfg_if +0 -1
  28. package/src/rust/target/release/.fingerprint/cfg-if-26f63e0967bee367/lib-cfg_if.json +0 -1
  29. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/build-script-build-script-build +0 -1
  30. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/build-script-build-script-build.json +0 -1
  31. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/dep-build-script-build-script-build +0 -0
  32. package/src/rust/target/release/.fingerprint/log-27022fbed75e0765/invoked.timestamp +0 -1
  33. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/dep-lib-log +0 -0
  34. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/invoked.timestamp +0 -1
  35. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/lib-log +0 -1
  36. package/src/rust/target/release/.fingerprint/log-77a2b15818511956/lib-log.json +0 -1
  37. package/src/rust/target/release/.fingerprint/log-e84eaabb9bd44eb4/run-build-script-build-script-build +0 -1
  38. package/src/rust/target/release/.fingerprint/log-e84eaabb9bd44eb4/run-build-script-build-script-build.json +0 -1
  39. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/build-script-build-script-build +0 -1
  40. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/build-script-build-script-build.json +0 -1
  41. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/dep-build-script-build-script-build +0 -0
  42. package/src/rust/target/release/.fingerprint/proc-macro2-4bfff30b5fc4cb97/invoked.timestamp +0 -1
  43. package/src/rust/target/release/.fingerprint/proc-macro2-5841341c69f10991/run-build-script-build-script-build +0 -1
  44. package/src/rust/target/release/.fingerprint/proc-macro2-5841341c69f10991/run-build-script-build-script-build.json +0 -1
  45. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/dep-lib-proc_macro2 +0 -0
  46. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/invoked.timestamp +0 -1
  47. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/lib-proc_macro2 +0 -1
  48. package/src/rust/target/release/.fingerprint/proc-macro2-78d2de1a55ac02b2/lib-proc_macro2.json +0 -1
  49. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/dep-lib-quote +0 -0
  50. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/invoked.timestamp +0 -1
  51. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/lib-quote +0 -1
  52. package/src/rust/target/release/.fingerprint/quote-536d2fed8f9d8732/lib-quote.json +0 -1
  53. package/src/rust/target/release/.fingerprint/rustversion-33c78623764430e6/run-build-script-build-script-build +0 -1
  54. package/src/rust/target/release/.fingerprint/rustversion-33c78623764430e6/run-build-script-build-script-build.json +0 -1
  55. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/build-script-build-script-build +0 -1
  56. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/build-script-build-script-build.json +0 -1
  57. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/dep-build-script-build-script-build +0 -0
  58. package/src/rust/target/release/.fingerprint/rustversion-c398d71ca0669ffc/invoked.timestamp +0 -1
  59. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/dep-lib-rustversion +0 -0
  60. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/invoked.timestamp +0 -1
  61. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/lib-rustversion +0 -1
  62. package/src/rust/target/release/.fingerprint/rustversion-db265df7d80a8662/lib-rustversion.json +0 -1
  63. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/dep-lib-syn +0 -0
  64. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/invoked.timestamp +0 -1
  65. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/lib-syn +0 -1
  66. package/src/rust/target/release/.fingerprint/syn-4d3d7efa31c6c7f3/lib-syn.json +0 -1
  67. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/dep-lib-unicode_ident +0 -0
  68. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/invoked.timestamp +0 -1
  69. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/lib-unicode_ident +0 -1
  70. package/src/rust/target/release/.fingerprint/unicode-ident-717c57863b369186/lib-unicode_ident.json +0 -1
  71. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/build-script-build-script-build +0 -1
  72. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/build-script-build-script-build.json +0 -1
  73. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/dep-build-script-build-script-build +0 -0
  74. package/src/rust/target/release/.fingerprint/wasm-bindgen-8074d255d7357147/invoked.timestamp +0 -1
  75. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/dep-lib-wasm_bindgen_backend +0 -0
  76. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/invoked.timestamp +0 -1
  77. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/lib-wasm_bindgen_backend +0 -1
  78. package/src/rust/target/release/.fingerprint/wasm-bindgen-backend-8f4a80df1d778f42/lib-wasm_bindgen_backend.json +0 -1
  79. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/dep-lib-wasm_bindgen_macro +0 -0
  80. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/invoked.timestamp +0 -1
  81. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/lib-wasm_bindgen_macro +0 -1
  82. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-9eb75cc91d1ac47b/lib-wasm_bindgen_macro.json +0 -1
  83. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/dep-lib-wasm_bindgen_macro_support +0 -0
  84. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/invoked.timestamp +0 -1
  85. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/lib-wasm_bindgen_macro_support +0 -1
  86. package/src/rust/target/release/.fingerprint/wasm-bindgen-macro-support-14689549cd7b65b6/lib-wasm_bindgen_macro_support.json +0 -1
  87. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-51aa8d774f2c628e/run-build-script-build-script-build +0 -1
  88. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-51aa8d774f2c628e/run-build-script-build-script-build.json +0 -1
  89. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/dep-lib-wasm_bindgen_shared +0 -0
  90. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/invoked.timestamp +0 -1
  91. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/lib-wasm_bindgen_shared +0 -1
  92. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-873126f2b1566d9c/lib-wasm_bindgen_shared.json +0 -1
  93. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build-script-build +0 -1
  94. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build-script-build.json +0 -1
  95. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/dep-build-script-build-script-build +0 -0
  96. package/src/rust/target/release/.fingerprint/wasm-bindgen-shared-f5ddbf25cd087b9d/invoked.timestamp +0 -1
  97. package/src/rust/target/release/build/log-27022fbed75e0765/build-script-build +0 -0
  98. package/src/rust/target/release/build/log-27022fbed75e0765/build_script_build-27022fbed75e0765 +0 -0
  99. package/src/rust/target/release/build/log-27022fbed75e0765/build_script_build-27022fbed75e0765.d +0 -5
  100. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/invoked.timestamp +0 -1
  101. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/output +0 -2
  102. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/root-output +0 -1
  103. package/src/rust/target/release/build/log-e84eaabb9bd44eb4/stderr +0 -0
  104. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build-script-build +0 -0
  105. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build_script_build-4bfff30b5fc4cb97 +0 -0
  106. package/src/rust/target/release/build/proc-macro2-4bfff30b5fc4cb97/build_script_build-4bfff30b5fc4cb97.d +0 -5
  107. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/invoked.timestamp +0 -1
  108. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/output +0 -16
  109. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/root-output +0 -1
  110. package/src/rust/target/release/build/proc-macro2-5841341c69f10991/stderr +0 -0
  111. package/src/rust/target/release/build/rustversion-33c78623764430e6/invoked.timestamp +0 -1
  112. package/src/rust/target/release/build/rustversion-33c78623764430e6/out/version.expr +0 -5
  113. package/src/rust/target/release/build/rustversion-33c78623764430e6/output +0 -3
  114. package/src/rust/target/release/build/rustversion-33c78623764430e6/root-output +0 -1
  115. package/src/rust/target/release/build/rustversion-33c78623764430e6/stderr +0 -0
  116. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build-script-build +0 -0
  117. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build_script_build-c398d71ca0669ffc +0 -0
  118. package/src/rust/target/release/build/rustversion-c398d71ca0669ffc/build_script_build-c398d71ca0669ffc.d +0 -6
  119. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build-script-build +0 -0
  120. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build_script_build-8074d255d7357147 +0 -0
  121. package/src/rust/target/release/build/wasm-bindgen-8074d255d7357147/build_script_build-8074d255d7357147.d +0 -5
  122. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/invoked.timestamp +0 -1
  123. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/output +0 -1
  124. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/root-output +0 -1
  125. package/src/rust/target/release/build/wasm-bindgen-shared-51aa8d774f2c628e/stderr +0 -0
  126. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build-script-build +0 -0
  127. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build_script_build-f5ddbf25cd087b9d +0 -0
  128. package/src/rust/target/release/build/wasm-bindgen-shared-f5ddbf25cd087b9d/build_script_build-f5ddbf25cd087b9d.d +0 -5
  129. package/src/rust/target/release/deps/bumpalo-952aca385c0ec8c7.d +0 -8
  130. package/src/rust/target/release/deps/cfg_if-26f63e0967bee367.d +0 -7
  131. package/src/rust/target/release/deps/libbumpalo-952aca385c0ec8c7.rlib +0 -0
  132. package/src/rust/target/release/deps/libbumpalo-952aca385c0ec8c7.rmeta +0 -0
  133. package/src/rust/target/release/deps/libcfg_if-26f63e0967bee367.rlib +0 -0
  134. package/src/rust/target/release/deps/libcfg_if-26f63e0967bee367.rmeta +0 -0
  135. package/src/rust/target/release/deps/liblog-77a2b15818511956.rlib +0 -0
  136. package/src/rust/target/release/deps/liblog-77a2b15818511956.rmeta +0 -0
  137. package/src/rust/target/release/deps/libproc_macro2-78d2de1a55ac02b2.rlib +0 -0
  138. package/src/rust/target/release/deps/libproc_macro2-78d2de1a55ac02b2.rmeta +0 -0
  139. package/src/rust/target/release/deps/libquote-536d2fed8f9d8732.rlib +0 -0
  140. package/src/rust/target/release/deps/libquote-536d2fed8f9d8732.rmeta +0 -0
  141. package/src/rust/target/release/deps/librustversion-db265df7d80a8662.dylib +0 -0
  142. package/src/rust/target/release/deps/libsyn-4d3d7efa31c6c7f3.rlib +0 -0
  143. package/src/rust/target/release/deps/libsyn-4d3d7efa31c6c7f3.rmeta +0 -0
  144. package/src/rust/target/release/deps/libunicode_ident-717c57863b369186.rlib +0 -0
  145. package/src/rust/target/release/deps/libunicode_ident-717c57863b369186.rmeta +0 -0
  146. package/src/rust/target/release/deps/libwasm_bindgen_backend-8f4a80df1d778f42.rlib +0 -0
  147. package/src/rust/target/release/deps/libwasm_bindgen_backend-8f4a80df1d778f42.rmeta +0 -0
  148. package/src/rust/target/release/deps/libwasm_bindgen_macro-9eb75cc91d1ac47b.dylib +0 -0
  149. package/src/rust/target/release/deps/libwasm_bindgen_macro_support-14689549cd7b65b6.rlib +0 -0
  150. package/src/rust/target/release/deps/libwasm_bindgen_macro_support-14689549cd7b65b6.rmeta +0 -0
  151. package/src/rust/target/release/deps/libwasm_bindgen_shared-873126f2b1566d9c.rlib +0 -0
  152. package/src/rust/target/release/deps/libwasm_bindgen_shared-873126f2b1566d9c.rmeta +0 -0
  153. package/src/rust/target/release/deps/log-77a2b15818511956.d +0 -9
  154. package/src/rust/target/release/deps/proc_macro2-78d2de1a55ac02b2.d +0 -14
  155. package/src/rust/target/release/deps/quote-536d2fed8f9d8732.d +0 -13
  156. package/src/rust/target/release/deps/rustversion-db265df7d80a8662.d +0 -20
  157. package/src/rust/target/release/deps/syn-4d3d7efa31c6c7f3.d +0 -55
  158. package/src/rust/target/release/deps/unicode_ident-717c57863b369186.d +0 -8
  159. package/src/rust/target/release/deps/wasm_bindgen_backend-8f4a80df1d778f42.d +0 -12
  160. package/src/rust/target/release/deps/wasm_bindgen_macro-9eb75cc91d1ac47b.d +0 -5
  161. package/src/rust/target/release/deps/wasm_bindgen_macro_support-14689549cd7b65b6.d +0 -8
  162. package/src/rust/target/release/deps/wasm_bindgen_shared-873126f2b1566d9c.d +0 -11
  163. package/src/rust/target/wasm32-unknown-unknown/CACHEDIR.TAG +0 -3
  164. package/src/rust/target/wasm32-unknown-unknown/release/.cargo-lock +0 -0
  165. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/dep-lib-cfg_if +0 -0
  166. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/invoked.timestamp +0 -1
  167. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/lib-cfg_if +0 -1
  168. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-3a3785674ee249ca/lib-cfg_if.json +0 -1
  169. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/dep-lib-cfg_if +0 -0
  170. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/invoked.timestamp +0 -1
  171. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/lib-cfg_if +0 -1
  172. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/cfg-if-74574db566dede99/lib-cfg_if.json +0 -1
  173. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/dep-lib-console_error_panic_hook +0 -0
  174. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/invoked.timestamp +0 -1
  175. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/lib-console_error_panic_hook +0 -1
  176. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/console_error_panic_hook-be3a0429a6c048b7/lib-console_error_panic_hook.json +0 -1
  177. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/dep-lib-grapher_rs +0 -0
  178. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/invoked.timestamp +0 -1
  179. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/lib-grapher_rs +0 -1
  180. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/grapher-rs-aff1dd7b7a7287aa/lib-grapher_rs.json +0 -1
  181. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/dep-lib-js_sys +0 -0
  182. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/invoked.timestamp +0 -1
  183. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/lib-js_sys +0 -1
  184. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/js-sys-6b38aa05f6fa3f57/lib-js_sys.json +0 -1
  185. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/dep-lib-once_cell +0 -0
  186. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/invoked.timestamp +0 -1
  187. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/lib-once_cell +0 -1
  188. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/once_cell-e662b25eb1a26f16/lib-once_cell.json +0 -1
  189. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-32de32a3c025e199/run-build-script-build-script-build +0 -1
  190. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-32de32a3c025e199/run-build-script-build-script-build.json +0 -1
  191. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/dep-lib-wasm_bindgen +0 -0
  192. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/invoked.timestamp +0 -1
  193. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/lib-wasm_bindgen +0 -1
  194. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/wasm-bindgen-99ed9f45b86292fd/lib-wasm_bindgen.json +0 -1
  195. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/dep-lib-web_sys +0 -0
  196. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/invoked.timestamp +0 -1
  197. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/lib-web_sys +0 -1
  198. package/src/rust/target/wasm32-unknown-unknown/release/.fingerprint/web-sys-07c24d9b289e70fd/lib-web_sys.json +0 -1
  199. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/invoked.timestamp +0 -1
  200. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/output +0 -1
  201. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/root-output +0 -1
  202. package/src/rust/target/wasm32-unknown-unknown/release/build/wasm-bindgen-32de32a3c025e199/stderr +0 -0
  203. package/src/rust/target/wasm32-unknown-unknown/release/deps/cfg_if-3a3785674ee249ca.d +0 -7
  204. package/src/rust/target/wasm32-unknown-unknown/release/deps/cfg_if-74574db566dede99.d +0 -7
  205. package/src/rust/target/wasm32-unknown-unknown/release/deps/console_error_panic_hook-be3a0429a6c048b7.d +0 -7
  206. package/src/rust/target/wasm32-unknown-unknown/release/deps/grapher_rs.d +0 -8
  207. package/src/rust/target/wasm32-unknown-unknown/release/deps/grapher_rs.wasm +0 -0
  208. package/src/rust/target/wasm32-unknown-unknown/release/deps/js_sys-6b38aa05f6fa3f57.d +0 -7
  209. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-3a3785674ee249ca.rlib +0 -0
  210. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-3a3785674ee249ca.rmeta +0 -0
  211. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-74574db566dede99.rlib +0 -0
  212. package/src/rust/target/wasm32-unknown-unknown/release/deps/libcfg_if-74574db566dede99.rmeta +0 -0
  213. package/src/rust/target/wasm32-unknown-unknown/release/deps/libconsole_error_panic_hook-be3a0429a6c048b7.rlib +0 -0
  214. package/src/rust/target/wasm32-unknown-unknown/release/deps/libconsole_error_panic_hook-be3a0429a6c048b7.rmeta +0 -0
  215. package/src/rust/target/wasm32-unknown-unknown/release/deps/libjs_sys-6b38aa05f6fa3f57.rlib +0 -0
  216. package/src/rust/target/wasm32-unknown-unknown/release/deps/libjs_sys-6b38aa05f6fa3f57.rmeta +0 -0
  217. package/src/rust/target/wasm32-unknown-unknown/release/deps/libonce_cell-e662b25eb1a26f16.rlib +0 -0
  218. package/src/rust/target/wasm32-unknown-unknown/release/deps/libonce_cell-e662b25eb1a26f16.rmeta +0 -0
  219. package/src/rust/target/wasm32-unknown-unknown/release/deps/libwasm_bindgen-99ed9f45b86292fd.rlib +0 -0
  220. package/src/rust/target/wasm32-unknown-unknown/release/deps/libwasm_bindgen-99ed9f45b86292fd.rmeta +0 -0
  221. package/src/rust/target/wasm32-unknown-unknown/release/deps/libweb_sys-07c24d9b289e70fd.rlib +0 -0
  222. package/src/rust/target/wasm32-unknown-unknown/release/deps/libweb_sys-07c24d9b289e70fd.rmeta +0 -0
  223. package/src/rust/target/wasm32-unknown-unknown/release/deps/once_cell-e662b25eb1a26f16.d +0 -7
  224. package/src/rust/target/wasm32-unknown-unknown/release/deps/wasm_bindgen-99ed9f45b86292fd.d +0 -21
  225. package/src/rust/target/wasm32-unknown-unknown/release/deps/web_sys-07c24d9b289e70fd.d +0 -13
  226. package/src/rust/target/wasm32-unknown-unknown/release/grapher_rs.d +0 -1
  227. package/src/rust/target/wasm32-unknown-unknown/release/grapher_rs.wasm +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs","mappings":"UAAIA,EACAC,E,8ECEAC,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,qxzCAAsxzC,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,gCAAgC,MAAQ,GAAG,SAAW,kwZAAkwZ,eAAiB,CAAC,khsBAAkhsB,WAAa,MAEns5E,S,uBCDAD,EAAOE,QAAU,SAAUC,GACzB,IAAIC,EAAO,GA4EX,OAzEAA,EAAKC,SAAW,WACd,OAAOC,KAAKC,KAAI,SAAUC,GACxB,IAAIC,EAAU,GACVC,OAA+B,IAAZF,EAAK,GAoB5B,OAnBIA,EAAK,KACPC,GAAW,cAAcE,OAAOH,EAAK,GAAI,QAEvCA,EAAK,KACPC,GAAW,UAAUE,OAAOH,EAAK,GAAI,OAEnCE,IACFD,GAAW,SAASE,OAAOH,EAAK,GAAGI,OAAS,EAAI,IAAID,OAAOH,EAAK,IAAM,GAAI,OAE5EC,GAAWN,EAAuBK,GAC9BE,IACFD,GAAW,KAETD,EAAK,KACPC,GAAW,KAETD,EAAK,KACPC,GAAW,KAENA,CACT,IAAGI,KAAK,GACV,EAGAT,EAAKU,EAAI,SAAWC,EAASC,EAAOC,EAAQC,EAAUC,GAC7B,iBAAZJ,IACTA,EAAU,CAAC,CAAC,KAAMA,OAASK,KAE7B,IAAIC,EAAyB,CAAC,EAC9B,GAAIJ,EACF,IAAK,IAAIK,EAAI,EAAGA,EAAIhB,KAAKM,OAAQU,IAAK,CACpC,IAAIrB,EAAKK,KAAKgB,GAAG,GACP,MAANrB,IACFoB,EAAuBpB,IAAM,EAEjC,CAEF,IAAK,IAAIsB,EAAK,EAAGA,EAAKR,EAAQH,OAAQW,IAAM,CAC1C,IAAIf,EAAO,GAAGG,OAAOI,EAAQQ,IACzBN,GAAUI,EAAuBb,EAAK,WAGrB,IAAVW,SACc,IAAZX,EAAK,KAGdA,EAAK,GAAK,SAASG,OAAOH,EAAK,GAAGI,OAAS,EAAI,IAAID,OAAOH,EAAK,IAAM,GAAI,MAAMG,OAAOH,EAAK,GAAI,MAF/FA,EAAK,GAAKW,GAMVH,IACGR,EAAK,IAGRA,EAAK,GAAK,UAAUG,OAAOH,EAAK,GAAI,MAAMG,OAAOH,EAAK,GAAI,KAC1DA,EAAK,GAAKQ,GAHVR,EAAK,GAAKQ,GAMVE,IACGV,EAAK,IAGRA,EAAK,GAAK,cAAcG,OAAOH,EAAK,GAAI,OAAOG,OAAOH,EAAK,GAAI,KAC/DA,EAAK,GAAKU,GAHVV,EAAK,GAAK,GAAGG,OAAOO,IAMxBd,EAAKL,KAAKS,GACZ,CACF,EACOJ,CACT,C,uBClFAJ,EAAOE,QAAU,SAAUM,GACzB,IAAIC,EAAUD,EAAK,GACfgB,EAAahB,EAAK,GACtB,IAAKgB,EACH,OAAOf,EAET,GAAoB,mBAATgB,KAAqB,CAC9B,IAAIC,EAASD,KAAKE,SAASC,mBAAmBC,KAAKC,UAAUN,MACzDO,EAAO,+DAA+DpB,OAAOe,GAC7EM,EAAgB,OAAOrB,OAAOoB,EAAM,OACxC,MAAO,CAACtB,GAASE,OAAO,CAACqB,IAAgBnB,KAAK,KAChD,CACA,MAAO,CAACJ,GAASI,KAAK,KACxB,C,6BCNA,IAAIoB,EAAuB,EAAQ,KAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBC,kBAAoBF,EAE3ClC,EAAOE,QAAU,WACf,SAASmC,EAAKC,EAAOC,EAAUC,EAAeC,EAAUC,EAAcC,GACpE,GAAIA,IAAWV,EAAf,CAIA,IAAIW,EAAM,IAAIC,MACZ,mLAKF,MADAD,EAAIE,KAAO,sBACLF,CAPN,CAQF,CAEA,SAASG,IACP,OAAOV,CACT,CAHAA,EAAKW,WAAaX,EAMlB,IAAIY,EAAiB,CACnBC,MAAOb,EACPc,OAAQd,EACRe,KAAMf,EACNgB,KAAMhB,EACNiB,OAAQjB,EACRkB,OAAQlB,EACRmB,OAAQnB,EACRoB,OAAQpB,EAERqB,IAAKrB,EACLsB,QAASZ,EACTa,QAASvB,EACTwB,YAAaxB,EACbyB,WAAYf,EACZgB,KAAM1B,EACN2B,SAAUjB,EACVkB,MAAOlB,EACPmB,UAAWnB,EACXoB,MAAOpB,EACPqB,MAAOrB,EAEPsB,eAAgBlC,EAChBC,kBAAmBF,GAKrB,OAFAe,EAAeqB,UAAYrB,EAEpBA,CACT,C,gBC/CEjD,EAAOE,QAAU,EAAQ,IAAR,E,uBCNnBF,EAAOE,QAFoB,8C,sBCP3B,IAAIqE,EAAc,GAClB,SAASC,EAAqBC,GAE5B,IADA,IAAIC,GAAU,EACL5D,EAAI,EAAGA,EAAIyD,EAAY3D,OAAQE,IACtC,GAAIyD,EAAYzD,GAAG2D,aAAeA,EAAY,CAC5CC,EAAS5D,EACT,KACF,CAEF,OAAO4D,CACT,CACA,SAASC,EAAavE,EAAMwE,GAG1B,IAFA,IAAIC,EAAa,CAAC,EACdC,EAAc,GACThE,EAAI,EAAGA,EAAIV,EAAKQ,OAAQE,IAAK,CACpC,IAAIN,EAAOJ,EAAKU,GACZb,EAAK2E,EAAQG,KAAOvE,EAAK,GAAKoE,EAAQG,KAAOvE,EAAK,GAClDwE,EAAQH,EAAW5E,IAAO,EAC1BwE,EAAa,GAAG9D,OAAOV,EAAI,KAAKU,OAAOqE,GAC3CH,EAAW5E,GAAM+E,EAAQ,EACzB,IAAIC,EAAoBT,EAAqBC,GACzCS,EAAM,CACRC,IAAK3E,EAAK,GACVQ,MAAOR,EAAK,GACZ4E,UAAW5E,EAAK,GAChBU,SAAUV,EAAK,GACfW,MAAOX,EAAK,IAEd,IAA2B,IAAvByE,EACFV,EAAYU,GAAmBI,aAC/Bd,EAAYU,GAAmBK,QAAQJ,OAClC,CACL,IAAII,EAAUC,EAAgBL,EAAKN,GACnCA,EAAQY,QAAU1E,EAClByD,EAAYkB,OAAO3E,EAAG,EAAG,CACvB2D,WAAYA,EACZa,QAASA,EACTD,WAAY,GAEhB,CACAP,EAAY/E,KAAK0E,EACnB,CACA,OAAOK,CACT,CACA,SAASS,EAAgBL,EAAKN,GAC5B,IAAIc,EAAMd,EAAQe,OAAOf,GAYzB,OAXAc,EAAIE,OAAOV,GACG,SAAiBW,GAC7B,GAAIA,EAAQ,CACV,GAAIA,EAAOV,MAAQD,EAAIC,KAAOU,EAAO7E,QAAUkE,EAAIlE,OAAS6E,EAAOT,YAAcF,EAAIE,WAAaS,EAAO3E,WAAagE,EAAIhE,UAAY2E,EAAO1E,QAAU+D,EAAI/D,MACzJ,OAEFuE,EAAIE,OAAOV,EAAMW,EACnB,MACEH,EAAII,QAER,CAEF,CACA9F,EAAOE,QAAU,SAAUE,EAAMwE,GAG/B,IAAImB,EAAkBpB,EADtBvE,EAAOA,GAAQ,GADfwE,EAAUA,GAAW,CAAC,GAGtB,OAAO,SAAgBoB,GACrBA,EAAUA,GAAW,GACrB,IAAK,IAAIlF,EAAI,EAAGA,EAAIiF,EAAgBnF,OAAQE,IAAK,CAC/C,IACImF,EAAQzB,EADKuB,EAAgBjF,IAEjCyD,EAAY0B,GAAOZ,YACrB,CAEA,IADA,IAAIa,EAAqBvB,EAAaqB,EAASpB,GACtCuB,EAAK,EAAGA,EAAKJ,EAAgBnF,OAAQuF,IAAM,CAClD,IACIC,EAAS5B,EADKuB,EAAgBI,IAEK,IAAnC5B,EAAY6B,GAAQf,aACtBd,EAAY6B,GAAQd,UACpBf,EAAYkB,OAAOW,EAAQ,GAE/B,CACAL,EAAkBG,CACpB,CACF,C,uBCjFA,IAAIG,EAAO,CAAC,EA+BZrG,EAAOE,QAPP,SAA0BoG,EAAQC,GAChC,IAAIC,EAtBN,SAAmBA,GACjB,QAA4B,IAAjBH,EAAKG,GAAyB,CACvC,IAAIC,EAAcC,SAASC,cAAcH,GAGzC,GAAII,OAAOC,mBAAqBJ,aAAuBG,OAAOC,kBAC5D,IAGEJ,EAAcA,EAAYK,gBAAgBC,IAC5C,CAAE,MAAOC,GAEPP,EAAc,IAChB,CAEFJ,EAAKG,GAAUC,CACjB,CACA,OAAOJ,EAAKG,EACd,CAIeS,CAAUX,GACvB,IAAKE,EACH,MAAM,IAAI3D,MAAM,2GAElB2D,EAAOU,YAAYX,EACrB,C,uBCvBAvG,EAAOE,QANP,SAA4B0E,GAC1B,IAAIhB,EAAU8C,SAASS,cAAc,SAGrC,OAFAvC,EAAQwC,cAAcxD,EAASgB,EAAQyC,YACvCzC,EAAQ0B,OAAO1C,EAASgB,EAAQA,SACzBhB,CACT,C,4BCCA5D,EAAOE,QANP,SAAwCoH,GACtC,IAAIC,EAAmD,KACnDA,GACFD,EAAaE,aAAa,QAASD,EAEvC,C,uBCoDAvH,EAAOE,QAjBP,SAAgB0E,GACd,GAAwB,oBAAb8B,SACT,MAAO,CACLd,OAAQ,WAAmB,EAC3BE,OAAQ,WAAmB,GAG/B,IAAIwB,EAAe1C,EAAQ6C,mBAAmB7C,GAC9C,MAAO,CACLgB,OAAQ,SAAgBV,IAjD5B,SAAeoC,EAAc1C,EAASM,GACpC,IAAIC,EAAM,GACND,EAAIhE,WACNiE,GAAO,cAAcxE,OAAOuE,EAAIhE,SAAU,QAExCgE,EAAIlE,QACNmE,GAAO,UAAUxE,OAAOuE,EAAIlE,MAAO,OAErC,IAAIN,OAAiC,IAAdwE,EAAI/D,MACvBT,IACFyE,GAAO,SAASxE,OAAOuE,EAAI/D,MAAMP,OAAS,EAAI,IAAID,OAAOuE,EAAI/D,OAAS,GAAI,OAE5EgE,GAAOD,EAAIC,IACPzE,IACFyE,GAAO,KAELD,EAAIlE,QACNmE,GAAO,KAELD,EAAIhE,WACNiE,GAAO,KAET,IAAIC,EAAYF,EAAIE,UAChBA,GAA6B,oBAAT3D,OACtB0D,GAAO,uDAAuDxE,OAAOc,KAAKE,SAASC,mBAAmBC,KAAKC,UAAUsD,MAAe,QAKtIR,EAAQ8C,kBAAkBvC,EAAKmC,EAAc1C,EAAQA,QACvD,CAoBM+C,CAAML,EAAc1C,EAASM,EAC/B,EACAY,OAAQ,YArBZ,SAA4BwB,GAE1B,GAAgC,OAA5BA,EAAaM,WACf,OAAO,EAETN,EAAaM,WAAWC,YAAYP,EACtC,CAgBMQ,CAAmBR,EACrB,EAEJ,C,uBC9CAtH,EAAOE,QAVP,SAA2BiF,EAAKmC,GAC9B,GAAIA,EAAaS,WACfT,EAAaS,WAAWC,QAAU7C,MAC7B,CACL,KAAOmC,EAAaW,YAClBX,EAAaO,YAAYP,EAAaW,YAExCX,EAAaJ,YAAYR,SAASwB,eAAe/C,GACnD,CACF,C,UCZAnF,EAAOE,QAAU,sG,UCAjBF,EAAOE,QAAU,mI,UCAjBF,EAAOE,QAAU,uoB,UCAjBF,EAAOE,QAAU,8Q,UCAjBF,EAAOE,QAAU,i5C,SCAjBF,EAAOE,QAAU,6hC,GCCbiI,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBjH,IAAjBkH,EACH,OAAOA,EAAapI,QAGrB,IAAIF,EAASmI,EAAyBE,GAAY,CACjDpI,GAAIoI,EAEJnI,QAAS,CAAC,GAOX,OAHAqI,EAAoBF,GAAUrI,EAAQA,EAAOE,QAASkI,GAG/CpI,EAAOE,OACf,CAGAkI,EAAoBI,EAAID,ECxBxBH,EAAoBK,EAAKzI,IACxB,IAAI0I,EAAS1I,GAAUA,EAAO2I,WAC7B,IAAO3I,EAAiB,QACxB,IAAM,EAEP,OADAoI,EAAoBQ,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdN,EAAoBQ,EAAI,CAAC1I,EAAS4I,KACjC,IAAI,IAAIC,KAAOD,EACXV,EAAoBY,EAAEF,EAAYC,KAASX,EAAoBY,EAAE9I,EAAS6I,IAC5EE,OAAOC,eAAehJ,EAAS6I,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDX,EAAoBiB,EAAI,CAAC,EAGzBjB,EAAoBpB,EAAKsC,GACjBC,QAAQC,IAAIP,OAAOQ,KAAKrB,EAAoBiB,GAAGK,QAAO,CAACC,EAAUZ,KACvEX,EAAoBiB,EAAEN,GAAKO,EAASK,GAC7BA,IACL,KCNJvB,EAAoBwB,EAAKN,GAEZA,EAAU,cCHvBlB,EAAoBY,EAAI,CAAC9D,EAAK2E,IAAUZ,OAAOa,UAAUC,eAAeC,KAAK9E,EAAK2E,GxBA9EjK,EAAa,CAAC,EACdC,EAAoB,WAExBuI,EAAoB6B,EAAI,CAACC,EAAKC,EAAMpB,EAAKO,KACxC,GAAG1J,EAAWsK,GAAQtK,EAAWsK,GAAKnK,KAAKoK,OAA3C,CACA,IAAIC,EAAQC,EACZ,QAAWjJ,IAAR2H,EAEF,IADA,IAAIuB,EAAU5D,SAAS6D,qBAAqB,UACpCzJ,EAAI,EAAGA,EAAIwJ,EAAQ1J,OAAQE,IAAK,CACvC,IAAI0J,EAAIF,EAAQxJ,GAChB,GAAG0J,EAAEC,aAAa,QAAUP,GAAOM,EAAEC,aAAa,iBAAmB5K,EAAoBkJ,EAAK,CAAEqB,EAASI,EAAG,KAAO,CACpH,CAEGJ,IACHC,GAAa,GACbD,EAAS1D,SAASS,cAAc,WAEzBuD,QAAU,QACjBN,EAAOO,QAAU,IACbvC,EAAoBwC,IACvBR,EAAO5C,aAAa,QAASY,EAAoBwC,IAElDR,EAAO5C,aAAa,eAAgB3H,EAAoBkJ,GAExDqB,EAAOS,IAAMX,GAEdtK,EAAWsK,GAAO,CAACC,GACnB,IAAIW,EAAmB,CAACC,EAAMC,KAE7BZ,EAAOa,QAAUb,EAAOc,OAAS,KACjCC,aAAaR,GACb,IAAIS,EAAUxL,EAAWsK,GAIzB,UAHOtK,EAAWsK,GAClBE,EAAOxC,YAAcwC,EAAOxC,WAAWC,YAAYuC,GACnDgB,GAAWA,EAAQC,SAASC,GAAQA,EAAGN,KACpCD,EAAM,OAAOA,EAAKC,EAAM,EAExBL,EAAUY,WAAWT,EAAiBU,KAAK,UAAMpK,EAAW,CAAEqK,KAAM,UAAWjF,OAAQ4D,IAAW,MACtGA,EAAOa,QAAUH,EAAiBU,KAAK,KAAMpB,EAAOa,SACpDb,EAAOc,OAASJ,EAAiBU,KAAK,KAAMpB,EAAOc,QACnDb,GAAc3D,SAASK,KAAKG,YAAYkD,EApCkB,CAoCX,EyBvChDhC,EAAoBsD,EAAKxL,IACH,oBAAXyL,QAA0BA,OAAOC,aAC1C3C,OAAOC,eAAehJ,EAASyL,OAAOC,YAAa,CAAEC,MAAO,WAE7D5C,OAAOC,eAAehJ,EAAS,aAAc,CAAE2L,OAAO,GAAO,ECL9DzD,EAAoB0D,EAAI,W,MCAxB1D,EAAoB2D,EAAIrF,SAASsF,SAAWC,KAAKxJ,SAASyJ,KAK1D,IAAIC,EAAkB,CACrB,IAAK,GAGN/D,EAAoBiB,EAAE+C,EAAI,CAAC9C,EAASK,KAElC,IAAI0C,EAAqBjE,EAAoBY,EAAEmD,EAAiB7C,GAAW6C,EAAgB7C,QAAWlI,EACtG,GAA0B,IAAvBiL,EAGF,GAAGA,EACF1C,EAAS5J,KAAKsM,EAAmB,QAC3B,CAGL,IAAIC,EAAU,IAAI/C,SAAQ,CAACgD,EAASC,IAAYH,EAAqBF,EAAgB7C,GAAW,CAACiD,EAASC,KAC1G7C,EAAS5J,KAAKsM,EAAmB,GAAKC,GAGtC,IAAIpC,EAAM9B,EAAoB0D,EAAI1D,EAAoBwB,EAAEN,GAEpDmD,EAAQ,IAAI5J,MAgBhBuF,EAAoB6B,EAAEC,GAfFc,IACnB,GAAG5C,EAAoBY,EAAEmD,EAAiB7C,KAEf,KAD1B+C,EAAqBF,EAAgB7C,MACR6C,EAAgB7C,QAAWlI,GACrDiL,GAAoB,CACtB,IAAIK,EAAY1B,IAAyB,SAAfA,EAAMS,KAAkB,UAAYT,EAAMS,MAChEkB,EAAU3B,GAASA,EAAMxE,QAAUwE,EAAMxE,OAAOqE,IACpD4B,EAAMG,QAAU,iBAAmBtD,EAAU,cAAgBoD,EAAY,KAAOC,EAAU,IAC1FF,EAAM3J,KAAO,iBACb2J,EAAMhB,KAAOiB,EACbD,EAAMI,QAAUF,EAChBN,EAAmB,GAAGI,EACvB,CACD,GAEwC,SAAWnD,EAASA,EAE/D,CACD,EAcF,IAAIwD,EAAuB,CAACC,EAA4BhL,KACvD,IAGIsG,EAAUiB,GAHT0D,EAAUC,EAAaC,GAAWnL,EAGhBjB,EAAI,EAC3B,GAAGkM,EAASG,MAAMlN,GAAgC,IAAxBkM,EAAgBlM,KAAa,CACtD,IAAIoI,KAAY4E,EACZ7E,EAAoBY,EAAEiE,EAAa5E,KACrCD,EAAoBI,EAAEH,GAAY4E,EAAY5E,IAG7C6E,GAAsBA,EAAQ9E,EAClC,CAEA,IADG2E,GAA4BA,EAA2BhL,GACrDjB,EAAIkM,EAASpM,OAAQE,IACzBwI,EAAU0D,EAASlM,GAChBsH,EAAoBY,EAAEmD,EAAiB7C,IAAY6C,EAAgB7C,IACrE6C,EAAgB7C,GAAS,KAE1B6C,EAAgB7C,GAAW,CAC5B,EAIG8D,EAAqBC,WAAgC,oBAAIA,WAAgC,qBAAK,GAClGD,EAAmB/B,QAAQyB,EAAqBtB,KAAK,KAAM,IAC3D4B,EAAmBrN,KAAO+M,EAAqBtB,KAAK,KAAM4B,EAAmBrN,KAAKyL,KAAK4B,G,KCrFvFhF,EAAoBwC,QAAKxJ,E,8FCAzB,MAAM,EAA+BkM,QAAQ,S,+BCAtC,MAAMC,EAAoB,CAC7B,SACA,SACA,WASSC,EAAa,IAAID,EAL1B,mBACA,oBACA,aCuBEE,EAMDnJ,IAAAA,IAECoJ,EAAepJ,IAAAA,MAAgB,CACjCvC,KAAM0L,EAAKzK,WACXyI,KAAMnH,IAAAA,MAAgB,IACfkJ,EACH,UAEJG,KAAMrJ,IAAAA,OACNsJ,KAAMtJ,IAAAA,OACNuJ,WAAYvJ,IAAAA,KACZwJ,MAAOxJ,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC9CxB,KAAMwB,IAAAA,OACNyJ,OAAQzJ,IAAAA,OACR0J,OAAQ1J,IAAAA,OACR2J,sBAAuB3J,IAAAA,KACvB4J,OAAQ5J,IAAAA,KACR6J,YAAa7J,IAAAA,QAAkBA,IAAAA,QAC/B8J,MAAO9J,IAAAA,OACP+J,mBAAoB/J,IAAAA,OACpBgK,KAAMhK,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC7CiK,YAAajK,IAAAA,QAAkBA,IAAAA,QAC/BkK,wBAAyBlK,IAAAA,KACzBmK,OAAQnK,IAAAA,KACRoK,SAAUpK,IAAAA,OACVqK,MAAOrK,IAAAA,OACPsK,WAAYtK,IAAAA,OACZuK,YAAavK,IAAAA,KACbwK,qBAAsBxK,IAAAA,KACtByK,UAAWzK,IAAAA,MAAgB,CAAC,OAAQ,MAAO,SAC3C0K,cAAe1K,IAAAA,OACf2K,SAAU3K,IAAAA,MACV4K,cAAe5K,IAAAA,OACf6K,cAAe7K,IAAAA,OACf8K,UAAW9K,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAClD+K,YAAa/K,IAAAA,OACbgL,aAAchL,IAAAA,OACdiL,cAAejL,IAAAA,KACfkL,YAAalL,IAAAA,OACbmL,SAAUnL,IAAAA,SAGRoL,EAASpL,IAAAA,QAAkBoJ,GAE3BiC,EAAOrL,IAAAA,MAAgB,CACzBsL,UAAWtL,IAAAA,OAAiBtB,WAC5B6M,OAAQvL,IAAAA,MAAgBtB,WACxB8M,KAAMxL,IAAAA,MAAgB,CAAC,OAAQ,UAAUtB,WACzC+M,MAAOzL,IAAAA,MAAgB,CAAC,SAAU,QAAQtB,WAC1CgN,MAAO1L,IAAAA,SAGL2L,EAAO3L,IAAAA,QAAkBqL,GAEzBO,EAAuB5L,IAAAA,MAAgB,CACzC0L,MAAO1L,IAAAA,OAAiBtB,WACxBmN,WAAY7L,IAAAA,KAAetB,WAC3BoN,UAAW9L,IAAAA,OAGT+L,EAAwB/L,IAAAA,QAAkB4L,GAE1CI,EAAoB,CACtBC,mBAAoBjM,IAAAA,KACpBkM,cAAelM,IAAAA,KACfmM,cAAenM,IAAAA,KACfoM,cAAepM,IAAAA,KACfqM,cAAerM,IAAAA,KACfsM,SAAUtM,IAAAA,KACVuM,oBAAqBvM,IAAAA,KACrBwM,cAAexM,IAAAA,MAAgB,CAAC,MAAO,WACvCyM,WAAYzM,IAAAA,OACZ0M,eAAgB1M,IAAAA,KAChB2M,cAAe3M,IAAAA,KACf4M,gBAAiB5M,IAAAA,UAAoB,CAACA,IAAAA,KAAgBA,IAAAA,UAGpD6M,EAAiB7M,IAAAA,MAAgBgM,GAEjCc,EAAa9M,IAAAA,MAAgB,CAC/B+M,EAAG/M,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqBgN,QACjFC,OAAQjN,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqBgN,QACtFE,KAAMlN,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,OAAkBA,IAAAA,WAAqBgN,QACpFzB,OAAQvL,IAAAA,QAAkBA,IAAAA,QAC1B7D,QAAS6D,IAAAA,OACTmN,SAAUnN,IAAAA,OAERoN,EAAcpN,IAAAA,QAAkB8M,GAEhCO,EAAiBrN,IAAAA,MAAgB,CACnC+M,EAAG/M,IAAAA,OAAiBtB,WACpB4O,EAAGtN,IAAAA,OAAiBtB,WACpB6O,OAAQvN,IAAAA,OACRwN,UAAWxN,IAAAA,OACXyN,YAAazN,IAAAA,OACb0N,YAAa1N,IAAAA,OACb2N,QAAS3N,IAAAA,KACT4N,cAAe5N,IAAAA,OAEb6N,EAAkB7N,IAAAA,QAAkBqN,GAEpCS,EAAe9N,IAAAA,MAAgB,CACjC+M,EAAG/M,IAAAA,OAAiBtB,WACpB8K,MAAOxJ,IAAAA,OACP+N,QAAS/N,IAAAA,OACT8J,MAAO9J,IAAAA,OACPgO,QAAShO,IAAAA,KACTiC,MAAOjC,IAAAA,OACPiO,YAAajO,IAAAA,OACbkO,KAAMlO,IAAAA,OACNmO,QAASnO,IAAAA,OACToO,UAAWpO,IAAAA,OACXqO,UAAWrO,IAAAA,OACXsO,UAAWtO,IAAAA,OACXuO,aAAcvO,IAAAA,UAAoB,CAC9BA,IAAAA,KACAA,IAAAA,SAEJwO,iBAAkBxO,IAAAA,OAsBtB,EAlBwB,CACpBmJ,OACAC,eACAgC,SACAC,OACAM,OACAC,uBACAG,wBACAc,iBACAb,oBACAoB,cACAC,iBACAQ,kBACAC,eACAW,cAhBkBzO,IAAAA,QAAkB8N,ICnJzBY,eAAeC,EAAWC,EAAQC,GAAS,MAACC,GAAM,GAAM,CAAC,GAChEA,IACAF,EAAO9E,MAAQ,GACf8E,EAAOG,OAAS,GAChBH,EAAO3M,MAAM6H,MAAQ,IACrB8E,EAAO3M,MAAM8M,OAAS,SAEhB,IAAI9J,SAASgD,GAAY+G,sBAAsB/G,MAGzD,IAAIgH,EAAeL,EAAOtL,WAAW4L,wBAErC,KAA8B,IAAvBD,EAAanF,aACV,IAAI7E,SAASgD,GAAY+G,sBAAsB/G,KACrDgH,EAAeL,EAAOM,wBAG1B,MAOMC,EAnCkB,GA4BZ7M,OAAO8M,kBAAoB,IAC3BP,EAAQQ,8BAChBR,EAAQS,2BACRT,EAAQU,0BACRV,EAAQW,yBACRX,EAAQY,wBAA0B,GAIhCC,EAAeT,EAAanF,MAC5B6F,EAAgBV,EAAaF,OAC7Ba,EAAcF,EAAeP,EAC7BU,EAAeF,EAAgBR,EAUrC,OARAP,EAAO9E,MAAQ8F,EACfhB,EAAOG,OAASc,EAChBjB,EAAO3M,MAAM6H,MAAS,GAAE4F,MACxBd,EAAO3M,MAAM8M,OAAU,GAAEY,MAKlB,CACHR,aACAO,eACAC,gBACAC,cACAC,eACAZ,eAER,CC1DO,MAAMa,EAAc,CACvB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGW,SAASC,EAASC,EAAaxT,EAAGyT,GAC7C,MAA2B,iBAAhBD,EACAA,EAGgB,iBAAhBA,EACAF,EAAYE,EAAcF,EAAYxT,aAGjBQ,IAA5BmT,EACOH,EAAYG,EAA0BH,EAAYxT,QAGtDwT,EAAYtT,EAAIsT,EAAYxT,OACvC,C,2ECpBe,SAAS4T,EAAc1G,GAClC,GAAc,UAAVA,EACAA,EAAQ,eACL,GAAc,UAAVA,EACPA,EAAQ,eACL,GAAc,gBAAVA,EACP,MAAO,CAAC,EAAG,EAAG,EAAG,GAGrB,GAAIA,EAAM2G,WAAW,OAAQ,CACzB,MAAMC,EAAQ5G,EAAM6G,MAAM,KAAKpU,KAAKqU,GAASC,WAAWD,EAAKE,MAAM,eAAe,MAClF,MAAO,CACHJ,EAAM,GAAG,IACTA,EAAM,GAAG,IACTA,EAAM,GAAG,IACTA,EAAM9T,QAAU,EAAI8T,EAAM,GAAK,EAEvC,CAEA,GAAqB,iBAAV5G,IAAuB,iBAAiBiH,KAAKjH,GACpD,MAAM,IAAIjL,MAAO,+BAA8BiL,KAOnD,MAAO,CAJGkH,SAASlH,EAAMmH,OAAO,EAAG,GAAK,IAAI,IAClCD,SAASlH,EAAMmH,OAAO,EAAG,GAAK,IAAI,IAClCD,SAASlH,EAAMmH,OAAO,EAAG,GAAK,IAAI,IAClC,EAEd,CCxBe,SAASC,EAAUC,GAAmB,SAACC,GAAU,CAAC,GAC7D,MAAMC,EAAQ,GACd,IAAIC,EAAc,GACdC,GAA0B,EAE9B,MAAM,SAAEC,EAAQ,WAAEC,EAAU,WAAEC,EAAU,QAAEC,GAAYR,EAEtD,IAAK,IAAIrU,EAAI,EAAGA,EAAI6U,EAAQ/U,OAAQE,IAAK,CACrC,MAAMuQ,EHlBc,EGkBVvQ,EACJ8Q,EAAI+D,EAAQ7U,GAElB,GAAkB,EAAd0U,EAAS1U,GAAY,CAChByU,IACDF,EAAMtV,KAAKuV,GACXA,EAAc,IAGlBC,GAA0B,EAC1B,QACJ,CAEAD,EAAYvV,KAAK,CAACsR,EAAGO,IAErB,MAAMgE,EAAOF,EAAW5U,GAClB+U,EAAOJ,EAAW3U,GAexB,GAbI8U,IAASC,IACW,EAAdL,EAAS1U,IACXwU,EAAYvV,KAAK,CAACsR,EAAGuE,IAGL,EAAdJ,EAAS1U,IACXwU,EAAYvV,KAAK,CAACsR,EAAGwE,IAEzBP,EAAYvV,KAAK,CAACsR,EAAGO,KAGzB2D,GAA0B,EAEF,iBAAbH,GAAyBtU,EAAI,EAAG,CACvC,MAAMgV,EAAQH,EAAQ7U,EAAE,MACc,EAAhB0U,EAAS1U,EAAE,KAAgBgV,EAAQV,GAAYxD,GAAKwD,GAAcU,EAAQV,GAAYxD,GAAKwD,GAAcU,IAAUV,GAAYxD,IAAMwD,KAGlJG,IACDF,EAAMtV,KAAKuV,GACXA,EAAc,CACV,CAACjE,EAAGO,KAIZ2D,GAA0B,EAElC,CACJ,CAMA,OAJKA,GACDF,EAAMtV,KAAKuV,GAGRD,CACX,CCvEA,IAAIU,EACG,MAAMC,EAAiB,6BAA+BC,MAAMjW,GACxDA,EAAOkW,UAAUD,MAAK,KACzBF,EAAgB/V,CAAM,MAIf,SAASmW,IACpB,OAAOJ,CACX,CCEO,SAASK,EAAyBf,GAAO,OAAEnH,EAAM,YAAEC,IACtD,IAAIkI,EAAc,EAClB,IAAK,IAAIC,KAAQjB,EACb,GAAInH,EACA,IAAK,IAAIpN,EAAI,EAAGA,EAAIwV,EAAK1V,OAAQE,IACzBoN,GAAUpN,GAAKqN,EAAY,GAAKA,EAAY,KAAOA,EAAY,IAGnEkI,SAGJA,GAAeC,EAAK1V,OAI5B,MAAM2V,EAAY,IAAIC,aAAyB,EAAZH,GAC7BI,EAAgB,IAAID,aAAyB,EAAZH,GACjCK,EAAW,IAAIF,aAAyB,EAAZH,GAC5BM,EAAU,IAAIC,YAAwB,EAAZP,GAEhC,GAAIA,EAAc,EAAG,CACjB,MAAMQ,EAAkB,IAAIL,aAAa,CAAC,EAAG,EAAG,EAAG,IACnDE,EAASI,IAAID,GACb,IAAIE,EAAgBF,EAAgBjW,OAChCoW,EAAeH,EAAgBjW,OACnC,KAAOmW,EAAgBL,EAAS9V,QACxBmW,EAAgBC,EAAeN,EAAS9V,SACxCoW,EAAeN,EAAS9V,OAASmW,GAGrCL,EAASO,WAAWF,EAAe,EAAGC,GACtCD,GAAiBC,EACjBA,IAAiB,CAEzB,CAEA,IAAIE,EAAS,EACb,IAAK,IAAIZ,KAAQjB,EACb,IAAK,IAAIvU,EAAI,EAAGA,EAAIwV,EAAK1V,OAAQE,IAAK,CAClC,GAAIoN,GAAUpN,GAAKqN,EAAY,GAAKA,EAAY,KAAOA,EAAY,GAC/D,SAGJ,MAAOkD,EAAGO,GAAK0E,EAAKxV,GAEpB,IAAIqW,EAAOrB,EAED,IAANhV,GACAqW,EAAQ9F,EAAI,EACZyE,EAAQlE,IAEPuF,EAAOrB,GAASQ,EAAKxV,EAAI,GAG9B,IAAK,IAAIsL,EAAI,EAAGA,EAAI,EAAGA,IACnBmK,EAAmB,EAATW,EAAa,EAAI9K,GAAKiF,EAChCkF,EAAmB,EAATW,EAAa,EAAI9K,EAAI,GAAKwF,EACpC6E,EAAuB,EAATS,EAAa,EAAI9K,GAAK+K,EACpCV,EAAuB,EAATS,EAAa,EAAI9K,EAAI,GAAK0J,EAG5Ca,EAAiB,EAATO,GAAuB,EAATA,EACtBP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EACvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EAEvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAC1BP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EACvCP,EAAiB,EAATO,EAAa,GAAc,EAATA,EAAa,EAEvCA,GACJ,CAGJ,MAAO,CACHX,YACAE,gBACAC,WACAC,UAER,CClFe,SAASS,EAAgBC,EAAIC,EAAkBC,GAC1D,MAAMC,EAAeH,EAAGI,aAAaJ,EAAGK,eACxCL,EAAGM,aAAaH,EAAcF,GAC9BD,EAAGO,cAAcJ,GACZH,EAAGQ,mBAAmBL,EAAcH,EAAGS,iBACxCC,QAAQtL,MAAM4K,EAAGW,iBAAiBR,IAGtC,MAAMS,EAAiBZ,EAAGI,aAAaJ,EAAGa,iBAC1Cb,EAAGM,aAAaM,EAAgBV,GAChCF,EAAGO,cAAcK,GACZZ,EAAGQ,mBAAmBI,EAAgBZ,EAAGS,iBAC1CC,QAAQtL,MAAM4K,EAAGW,iBAAiBC,IAGtC,MAAME,EAAUd,EAAGe,gBAWnB,OAVAf,EAAGgB,aAAaF,EAASX,GACzBH,EAAGgB,aAAaF,EAASF,GAEzBZ,EAAGiB,YAAYH,GACfd,EAAGkB,gBAAgBJ,GAEdd,EAAGmB,oBAAoBL,EAASd,EAAGoB,cACpCV,QAAQtL,MAAM4K,EAAGqB,kBAAkBP,IAGhCA,CACX,CC1Be,MAAMQ,EAEjBC,WAAAA,CAAYvB,GACR/W,KAAKuY,IAAMxB,EAEX/W,KAAKwY,SAAW1B,EAAgBC,EAAI0B,IAAUC,KAC9C1Y,KAAK2Y,eAAiB7B,EAAgBC,EAAI6B,IAAYC,KAEtD7Y,KAAK8Y,gBAAkB/B,EAAGgC,eAC1B/Y,KAAKgZ,oBAAsBjC,EAAGgC,eAC9B/Y,KAAKiZ,cAAgBlC,EAAGgC,eACxB/Y,KAAKkZ,aAAenC,EAAGgC,eACvB/Y,KAAKmZ,uBAAyBpC,EAAGgC,eAE5BhC,EAAGqC,aAAa,2BACjB3B,QAAQtL,MAAM,uDAEtB,CAEAkN,OAAAA,GAEA,CAEAC,KAAAA,GACI,MAAMvC,EAAK/W,KAAKuY,IACVzK,EAAQiJ,EAAGwC,mBACXxG,EAASgE,EAAGyC,oBAElBzC,EAAG0C,WAAW,EAAG,EAAG,EAAG,GACvB1C,EAAGuC,MAAMvC,EAAG2C,iBAAmB3C,EAAG4C,kBAClC5C,EAAG6C,SAAS,EAAG,EAAG9L,EAAOiF,EAC7B,CAmBA8G,IAAAA,CAAKhF,EAAmBiF,GACpB,MAAM/C,EAAK/W,KAAKuY,IACVzK,EAAQiJ,EAAGwC,mBACXxG,EAASgE,EAAGyC,oBAClBzC,EAAGgD,WAAW/Z,KAAKwY,UAInB,MAAMwB,EPnEc,IOmEaF,EAAWhM,OAAS,IAAMgM,EAAWG,YAAc,EAAI,IAClFC,OAAuCpZ,IAA1BgZ,EAAWI,WAA2B,EAAIJ,EAAWI,WAClEhL,EAAc4K,EAAW5K,aAAe,QACxCtB,EAASkM,EAAWlM,SAAU,EAC9BC,EAAciM,EAAWjM,aAAe,CAAC,EAAG,IAE5C,UAACoI,EAAS,cAAEE,EAAa,SAAEC,EAAQ,QAAEC,GF2BpC,SAAyBxB,GAAmB,OAAEjH,EAAM,YAAEC,IACjE,GAAIgH,EAAkBE,MAClB,OAAOe,EAAyBjB,EAAkBE,MAAO,CAAEnH,SAAQC,gBAGvE,IAAKgI,IAED,OAAOC,EADOlB,EAAUC,GACe,CAAEjH,SAAQC,gBAGrD,MAAMkI,EAAcF,IAAUsE,iBAC1BtF,EAAkBK,SAAUL,EAAkBQ,QAASR,EAAkBO,WAAYP,EAAkBM,WACvGvH,EAAQC,EAAY,GAAIA,EAAY,IAGxC,IAAIoI,EAAY,IAAIC,aAAyB,EAAZH,GAC7BI,EAAgB,IAAID,aAAyB,EAAZH,GACjCK,EAAW,IAAIF,aAAyB,EAAZH,GAC5BM,EAAU,IAAIC,YAAwB,EAAZP,GAS9B,OAPAF,IAAUuE,iBLxHc,EK0HpBvF,EAAkBK,SAAUL,EAAkBQ,QAASR,EAAkBO,WAAYP,EAAkBM,WACvGc,EAAWE,EAAeC,EAAUC,EACpCzI,EAAQC,EAAY,GAAIA,EAAY,IAGjC,CACHoI,YACAE,gBACAC,WACAC,UAER,CE5D8DgE,CAAgBxF,EAAmB,CAAEjH,SAAQC,gBAE7FyM,EAAgBvD,EAAGwD,kBAAkBva,KAAKwY,SAAU,YACpDgC,EAAoBzD,EAAGwD,kBAAkBva,KAAKwY,SAAU,gBACxDiC,EAAc1D,EAAGwD,kBAAkBva,KAAKwY,SAAU,UA4BxD,GA1BAzB,EAAG2D,wBAAwBJ,GAC3BvD,EAAG4D,WAAW5D,EAAG6D,aAAc5a,KAAK8Y,iBACpC/B,EAAG8D,WAAW9D,EAAG6D,aAAc3E,EAAWc,EAAG+D,aAC7C/D,EAAGgE,oBAAoBT,EAAe,EAAGvD,EAAGiE,OAAO,EAAO,EAAG,GAE7DjE,EAAG2D,wBAAwBF,GAC3BzD,EAAG4D,WAAW5D,EAAG6D,aAAc5a,KAAKgZ,qBACpCjC,EAAG8D,WAAW9D,EAAG6D,aAAczE,EAAeY,EAAG+D,aACjD/D,EAAGgE,oBAAoBP,EAAmB,EAAGzD,EAAGiE,OAAO,EAAO,EAAG,GAEjEjE,EAAG2D,wBAAwBD,GAC3B1D,EAAG4D,WAAW5D,EAAG6D,aAAc5a,KAAKiZ,eACpClC,EAAG8D,WAAW9D,EAAG6D,aAAcxE,EAAUW,EAAG+D,aAC5C/D,EAAGgE,oBAAoBN,EAAa,EAAG1D,EAAGiE,OAAO,EAAO,EAAG,GAE3DjE,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,SAAU1K,GAC5DiJ,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,UAAWzF,GAC7DgE,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,aAAc2C,KAAKC,IAAIpB,EAAW,GAAGE,GACvFnD,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,cAAe0B,GACjEnD,EAAGsE,UAAUtE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,YAAatE,EAAc4F,EAAWtM,QACxFuJ,EAAGsE,UAAUtE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,kBAAmBtE,EAAchF,IAEnF6H,EAAG4D,WAAW5D,EAAGuE,qBAAsBtb,KAAKkZ,cAC5CnC,EAAG8D,WAAW9D,EAAGuE,qBAAsBjF,EAASU,EAAG+D,aACnD/D,EAAGwE,aAAaxE,EAAGyE,UAAWnF,EAAQ/V,OAAQyW,EAAG0E,aAAc,GAE3D3B,EAAWtL,qBAAsB,CACjCuI,EAAGgD,WAAW/Z,KAAK2Y,gBAEnB5B,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAK2Y,eAAgB,SAAU7K,GAClEiJ,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAK2Y,eAAgB,UAAW5F,GACnEgE,EAAGkE,UAAUlE,EAAGmE,mBAAmBlb,KAAK2Y,eAAgB,aAAc,GAAGqB,EAAU,IACnFjD,EAAGsE,UAAUtE,EAAGmE,mBAAmBlb,KAAK2Y,eAAgB,YAAazE,EAAc4F,EAAWtM,QAE9F,MAAMkO,EAAmB5B,EAAW6B,sBAEpC5E,EAAG2D,wBAAwB,GAC3B3D,EAAG4D,WAAW5D,EAAG6D,aAAc5a,KAAKmZ,wBACpCpC,EAAG8D,WAAW9D,EAAG6D,aAAc,IAAI1E,aAAawF,EAAiBE,QAAS7E,EAAG+D,aAC7E/D,EAAGgE,oBAAoB,EAAG,EAAGhE,EAAGiE,OAAO,EAAO,EAAG,GAEjDjE,EAAG8E,WAAW9E,EAAG+E,OAAQ,EAAGJ,EAAiBpb,OACjD,CACJ,EC1HW,MAAMyb,EAEjBzD,WAAAA,GACItY,KAAKgc,WAAa,CAAC,CACvB,CAMAC,cAAAA,GACIjc,KAAKgc,WAAa,CAAC,CACvB,CASAE,EAAAA,CAAGC,EAAWnR,GACVhL,KAAKgc,WAAWG,GAAanc,KAAKgc,WAAWG,IAAc,IAAIC,IAC/Dpc,KAAKgc,WAAWG,GAAWE,IAAIrR,EACnC,CAQAsR,GAAAA,CAAIH,EAAWnR,GACNhL,KAAKgc,WAAWG,KAIrBnc,KAAKgc,WAAWG,GAAWI,OAAOvR,GAEM,IAApChL,KAAKgc,WAAWG,GAAWK,aACpBxc,KAAKgc,WAAWG,GAE/B,CAOAM,IAAAA,CAAKN,GACD,IAAKnc,KAAKgc,WAAWG,GACjB,OAGJ,MAAMO,EAAO,GACb,IAAK,IAAIlc,EAAI,EAAGA,EAAImc,UAAUrc,OAAQE,IAClCkc,EAAKjd,KAAKkd,UAAUnc,IAGxBR,KAAKgc,WAAWG,GAAWpR,SAASC,IAChCA,EAAG3D,MAAMrH,KAAM0c,EAAK,GAE5B,E,wCCzDW,MAAME,EAEjBtE,WAAAA,CAAYvB,GACR/W,KAAKuY,IAAMxB,EAEX/W,KAAKwY,SAAW1B,EAAgBC,EAAI8F,IAAgBC,KAEpD9c,KAAKiZ,cAAgBlC,EAAGgC,eACxB/Y,KAAKkZ,aAAenC,EAAGgC,eAElBhC,EAAGqC,aAAa,2BACjB3B,QAAQtL,MAAM,uDAEtB,CAEA0N,IAAAA,EAAK,KAAEpY,IACH,MAAMsV,EAAK/W,KAAKuY,IAChBxB,EAAGgD,WAAW/Z,KAAKwY,UAInB,IAAK,IAAI,MAAEuE,EAAK,MAAEC,EAAK,MAAExP,KAAW/L,EAAM,CACtCsV,EAAGsE,UAAUtE,EAAGmE,mBAAmBlb,KAAKwY,SAAU,YAAatE,EAAc1G,IAE7E,MAAM4I,EAAW,IAAIF,aAAa,CAC9B6G,EAAO,EAAGC,EAAO,EAAGA,GAAQ,EAC5BD,EAAO,EAAGC,GAAQ,EAAGD,GAAQ,IAGjChG,EAAG4D,WAAW5D,EAAG6D,aAAc5a,KAAKiZ,eACpClC,EAAG8D,WAAW9D,EAAG6D,aAAc,IAAI1E,aAAaE,GAAWW,EAAG+D,aAE9D,MAAMmC,EAAmBlG,EAAGwD,kBAAkBva,KAAKwY,SAAU,YAC7DzB,EAAG2D,wBAAwBuC,GAC3BlG,EAAGgE,oBAAoBkC,EAAkB,EAAGlG,EAAGiE,OAAO,EAAO,EAAG,GAEhEjE,EAAGmG,OAAOnG,EAAGoG,OACbpG,EAAGqG,UAAUrG,EAAGsG,UAAWtG,EAAGuG,qBAC9BvG,EAAG8E,WAAW9E,EAAGyE,UAAW,EAAG,EACnC,CACJ,EClCG,SAAS+B,EAAajM,GAAG,QAAEuB,EAAO,OAAE2K,EAAM,MAAEhQ,EAAK,UAAEiQ,EAAS,UAAEC,IAC5DA,IAIL7K,EAAQ8K,YAAcF,GAAajQ,EACnCqF,EAAQ+K,UAAYF,EAEpB7K,EAAQgL,YACRhL,EAAQiL,OAAO,EAAGxM,GAClBuB,EAAQkL,OAAOP,EAAO5J,YAAatC,GACnCuB,EAAQmL,SACZ,CC2CO,SAASC,GAAa,eAACC,EAAc,OAAEC,EAAM,OAAEX,EAAM,gBAAEY,IAE1D,MAAMC,EAAeH,GAAkBC,EAAOG,KAAOH,EAAOI,MAAQf,EAAO5J,YAErE4K,EAA+B,GAAfH,EAItB,MAAO,CACHI,SAHaD,EAAgBJ,EAI7BI,gBACAE,WAN8B,GAAfL,EAQvB,CCnEe,SAASM,EAAUpP,EAAQjL,EAAQ,CAAEsa,eAAe,IAC/D,GAAIrP,EAAOpE,MAAwB,UAAhBoE,EAAOpE,KACtB,OAAOoE,EAAOpE,KAGlB,MAAM1J,EAAO6C,EAAQ7C,MAAS6C,EAAQsa,eAAiBrP,EAAOsP,YAA6BtP,EAAO9N,KAElG,IAAKA,EACD,MAAM,IAAIc,MAAM,yBAGpB,GAAIuc,MAAMC,QAAQtd,GACd,OAAoB,IAAhBA,EAAKnB,QAILwe,MAAMC,QAAQtd,EAAK,IAHZ,SAOY,iBAAZA,EAAK,IAAoBA,EAAK,GAIlC,UAHI,SAMf,GAAIA,EAAKud,QACL,OAAIzP,EAAOlC,KACA,oBAEA,mBAIf,GAAoB,mBAAT5L,EACP,MAAO,YAGX,MAAM,IAAIc,MAAM,uBACpB,CCzCe,MAAM0c,UAA0BlD,EAE3CzD,WAAAA,EAAY,gBAAC4G,EAAe,cAAEC,EAAa,MAAEC,GAAM,EAAK,kBAAEC,GAAkB,IACxEC,QAEAtf,KAAKuf,iBAAmBL,EAExBlf,KAAKwf,mBAAqBH,EAC1Brf,KAAKyf,QAAUN,EACfnf,KAAK0f,OAASN,EACVA,IACApf,KAAK2f,SAAW3f,KAAKyf,QAAQG,WAAW,SACpC5f,KAAK2f,SACL3f,KAAK6f,aAAe,IAAIxH,EAAYrY,KAAK2f,WAEzCG,MAAM,sDACN9f,KAAK0f,QAAS,IAIjB1f,KAAK0f,SACN1f,KAAK2f,SAAW3f,KAAKyf,QAAQG,WAAY,MACzC5f,KAAK+f,WAAa/f,KAAK2f,UAG3B3f,KAAKggB,aAAehgB,KAAKigB,oBAEzBjgB,KAAKkgB,aAAelgB,KAAKmgB,OAAOjV,KAAKlL,MACrCA,KAAKogB,iBAAmB,KACxBpgB,KAAKqgB,cAAiBC,IAClB,MAAM5b,EAAQ4b,EAAKC,QAAO,EAAGhR,YAAaA,EAAOjP,OAAS,IAAGA,OACzDN,KAAKogB,mBAAqB1b,IAC1B1E,KAAKogB,iBAAmB1b,EACxB1E,KAAKmgB,SACT,EAGJjB,EAAgBhD,GAAG,eAAgBlc,KAAKqgB,eACxCnB,EAAgBhD,GAAG,qBAAsBlc,KAAKkgB,cAC9ChB,EAAgBhD,GAAG,0BAA2Blc,KAAKkgB,aACvD,CAKA7G,OAAAA,GACIrZ,KAAKic,iBACLjc,KAAK6f,cAAgB7f,KAAK6f,aAAaxG,UACvCrZ,KAAKogB,iBAAmB,KACxBpgB,KAAKuf,iBAAiBjD,IAAI,eAAgBtc,KAAKqgB,eAC/CrgB,KAAKuf,iBAAiBjD,IAAI,qBAAsBtc,KAAKkgB,cAEjDlgB,KAAKwgB,iBACLxgB,KAAKwgB,gBAAgBC,aAGrBzgB,KAAK0gB,uBACL1gB,KAAK0gB,sBAAsBD,YAEnC,CAEAnH,KAAAA,GACQtZ,KAAK0f,OACL1f,KAAK6f,aAAavG,QAElBtZ,KAAK2f,SAASgB,UAAU,EAAG,EAAG3gB,KAAK2f,SAAS/M,OAAO9E,MAAO9N,KAAK2f,SAAS/M,OAAOG,OAEvF,CAEA6N,MAAAA,CAAOC,EAAcC,GAAe,YAAE7G,EAAW,qBAAEzL,EAAoB,YAAEU,EAAW,WAAEgL,EAAU,MAAEpM,EAAK,iBAAEiT,EAAgB,OAAE5C,EAAM,aAAE6C,EAAY,wBAAEC,IAC7I,MAAMtF,EAAuBuF,IACpB/C,IACDA,EAAS0C,EAAa7S,KAAKmT,eAG/B,MAAMzF,EAAmB,GACzB,IAAIja,EAAOof,EAAaO,gBAAgB3f,KACpCyf,IACAzf,EAAOof,EAAaQ,aAGxB,IAAK,IAAKtQ,EAAGO,KAAM7P,EACL,OAAN6P,GAIJoK,EAAiBjc,KAAK,EACjBsR,EAAIoN,EAAOI,OAASJ,EAAOG,KAAOH,EAAOI,MAAQve,KAAKshB,QAAQ1N,aAC9D,GAAOtC,EAAI6M,EAAO7I,OAAS6I,EAAO5I,KAAO4I,EAAO7I,OAAStV,KAAKshB,QAAQzN,eAI/E,OAAO6H,CAAgB,EAwC3B,IAAI6F,EAEJ,GAHgD,QAA3BV,EAAapS,WAAkD,SAA3BoS,EAAapS,UAGpD,CAEdzO,KAAK+f,WAAa/f,KAAK+f,YAAc/f,KAAKyf,QAAQG,WAAW,MAEzD5f,KAAK0f,QAEL1f,KAAK2f,SAAS6B,QAGbrD,IACDA,EAAS0C,EAAa7S,KAAKmT,eAG/B,MAAMM,EAAkC,WAA3BZ,EAAa/R,UACtB9O,KAAKshB,QAAQzN,cACZ,IAAQgN,EAAa/R,WAAa,GAAKqP,EAAO7I,OAAS6I,EAAO5I,KAAO4I,EAAO7I,OAAStV,KAAKshB,QAAQzN,aAEvG0N,EAAkB,CACd1O,QAAS7S,KAAK+f,WACdvS,MAAOuG,EAAS8M,EAAarT,MAAOqT,EAAalb,MAAOkb,EAAa5M,yBACrEuJ,OAAQxd,KAAKshB,QACbG,OACAC,eAAgBb,EAAaQ,YAAYM,MAAMC,GAAUA,EAAM,GAAK,IACpElT,cAAemS,EAAanS,cAC5BgP,UAAWmD,EAAajS,cACxB6O,UAAWoD,EAAahS,gBAGvB0S,EAAgBG,cAAgBb,EAAa5S,cAC9CsT,EAAgBG,aAAeb,EAAa5S,YAAYpB,MAAMyE,GAAMA,EAAI,IAEhF,CAEA,GAA+B,QAA3BuP,EAAapS,UAQb,YFpKG,SAAkBiN,GAAkB,MAC/ClO,EAAK,QAAEqF,EAAO,OAAE2K,EAAM,YAAEqE,EAAW,gBAAEzD,EAAe,KAAEqD,EAAI,aAAEC,EAAY,cAAEhT,EAAa,UAAE+O,EAAS,UAAEC,EAAS,eAAEQ,EAAc,OAAEC,IAE/HtL,EAAQ8K,YAAcnQ,EACtBqF,EAAQiP,UAAYtU,EAEpB,MAAM,SAACiR,EAAQ,cAAED,GAAiBP,EAAa,CAAEC,iBAAgBC,SAAQX,SAAQY,oBAC3E2D,EAAYL,EAAeD,EAAOjE,EAAO3J,aAE/C,IAAK,IAAIrT,EAAI,EAAGA,EAAIkb,EAAiBpb,OAAQE,IAAK,CAC9C,MAAOuQ,EAAGO,GAAKoK,EAAiBlb,GAE5BkhB,IAEI7O,EAAQiP,UADRxQ,GAAKmQ,EACejU,EAEAkB,GAI5BmE,EAAQmP,SAASjR,EAAIyN,EAAgB,EAAIC,EAASoD,EAAavQ,EAAGmN,EAAUsD,EAAUzQ,EAC1F,CAEIoM,GACAH,EAAawE,EAAW,CACpBlP,UACA2K,SACAhQ,QACAiU,OACAhE,YACAC,aAGZ,CE4HYuE,CAAStG,GAAoB,GAAO,IAC7B4F,EACHM,YAAahB,EAAa7S,KAAKuB,OAAO2S,QAAQrB,GAC9CzC,gBAAiByC,EAAa7S,KAAKuB,OAAOjP,OAC1C4d,eAAgB8C,EAAa9C,eAC7BC,WAKR,GAA+B,SAA3B0C,EAAapS,UAYb,YChLG,SAAkBiN,EAAkB7G,GAAmB,MAClErH,EAAK,QAAEqF,EAAO,OAAE2K,EAAM,KAAEiE,EAAI,aAAEC,EAAY,SAAE/S,EAAQ,UACpD8O,EAAS,UAAEC,EAAS,qBAAElP,EAAoB,cAAEE,EAAa,YAAEK,EAAW,MAAEjB,EAAK,YAAEmM,EAAW,YAC1F/K,EAAY,QAAO,WAAEgL,EAAW,EAAC,wBAAE+G,IAMnC,GAJApO,EAAQiP,UAAYtU,EACpBqF,EAAQ3D,YAAcA,EACtB2D,EAAQqH,WAAaA,EAEjBvL,GAAYA,EAASrO,OAAS,EAAG,CACjC,MAAM6hB,EAAiBtP,EAAQuP,qBAAqB,EAAG,EAAG,EAAG5E,EAAO3J,cAEpE,IAAK,IAAIrT,EAAI,EAAGA,EAAImO,EAASrO,OAAQE,IAAK,CACtC,MAAM+K,EAAQoD,EAASnO,GACnBse,MAAMC,QAAQxT,GACd4W,EAAeE,aAAa9W,EAAM,GAAIA,EAAM,IAE5C4W,EAAeE,aAAa7hB,GAAKmO,EAASrO,OAAS,GAAIiL,EAE/D,CAEAsH,EAAQiP,UAAYK,EAEN,aAAV3U,IACAqF,EAAQ8K,YAAcwE,EAE9B,MACItP,EAAQiP,UAAYtU,EAGxB,IAAKkO,EAAiBpb,OAClB,OAIJ,MAAMgiB,EAAaZ,EAAeD,EAAOjE,EAAO3J,aAE1C0O,EAAY3N,EAAUC,GACtB2N,EAAkBvB,GAA2BrM,EAAUqM,GAEvDwB,EAAY7N,EAAUC,EAAmB,CAC3CC,SAAU2M,IAGd,IAAK,IAAIiB,EAAQ,EAAGA,EAAQH,EAAUjiB,OAAQoiB,IAAS,CACnD,MAAM1M,EAAOuM,EAAUG,GACjBC,EAAiBH,GAAmBA,EAAgBE,GAC1D7P,EAAQgL,YAER,MAAO+E,EAAQC,GAAW7M,EAAK,IACxB8M,EAAOC,GAAU/M,EAAKA,EAAK1V,OAAS,GAEtCkiB,GACD3P,EAAQiL,OAAO8E,EAAQN,GAG3B,IAAK,IAAI9hB,EAAI,EAAGA,EAAIwV,EAAK1V,OAAQE,IAAK,CAClC,MAAOuQ,EAAGO,GAAK0E,EAAKxV,GACpBqS,EAAQkL,OAAOhN,EAAGO,EACtB,CAEA,GAAIqR,GAAkBA,EAAeriB,OAAQ,CACzC,IAAK,IAAIE,EAAImiB,EAAeriB,OAAS,EAAGE,GAAK,EAAGA,IAAK,CACjD,MAAOuQ,EAAGO,GAAKqR,EAAeniB,GAC9BqS,EAAQkL,OAAOhN,EAAGO,EACtB,CAEAuB,EAAQkL,UAAU/H,EAAK,GAC3B,MACInD,EAAQkL,OAAO+E,EAAOR,GAG1BzP,EAAQmQ,MACZ,CAEI/I,IACAnM,GAAS,GAGbA,GdxGwB,EcyGxB+E,EAAQ8K,YAAcnQ,EACtBqF,EAAQ+K,UAAY9P,EAGpB,IAAK,IAAIkI,KAAQyM,EACb,GAAKzM,EAAK1V,OAAV,CAIA,GAAIohB,EAAc,CACd,IAAIuB,GAAW,EAEXA,EADAjN,EAAK1V,QAAU,EACJ0V,EAAK,GAAG,IAAMyL,EAEdzL,EAAK,GAAG,IAAMyL,EAIzB5O,EAAQ8K,YADRsF,EACsBzV,EAEAkB,CAE9B,CAEAmE,EAAQgL,YAER,IAAK,IAAIrd,EAAI,EAAGA,EAAIwV,EAAK1V,OAAQE,IAAK,CAClC,MAAOuQ,EAAGO,GAAK0E,EAAKxV,GAEV,IAANA,EACAqS,EAAQiL,OAAO/M,EAAGO,GAElBuB,EAAQkL,OAAOhN,EAAGO,EAE1B,CAEAuB,EAAQmL,QA7BR,CA2CJ,GAXIN,GACAH,EAAa+E,EAAY,CACrBzP,UACA2K,SACAhQ,QACAiU,OACAhE,YACAC,cAIJlP,EAAsB,CACtBqE,EAAQiP,UAAYtU,EAEpB,IAAK,IAAKuD,EAAGO,KAAMoK,EACXhN,GAAiBgT,IAEb7O,EAAQiP,UADRxQ,IAAMmQ,GAAQhE,EACMA,EACbnM,EAAImQ,EACSjU,EAEAkB,GAI5BmE,EAAQgL,YACRhL,EAAQqQ,IAAInS,EAAGO,EAAIvC,GAAc,EAAG,EAAG,EAAIoM,KAAKgI,IAAI,GACpDtQ,EAAQmQ,MAEhB,CACJ,CDgBYI,CAASzH,GAAoB,GAAOmF,EAAe,IAC5CS,EACH/S,qBAAmE,kBAAtCqS,EAAarS,qBAAqCqS,EAAarS,qBAAuBA,EACnHG,SAAUkS,EAAalS,SACvBI,YAAa8R,EAAa9R,YAC1BkL,cACAnM,MAAOA,GAAS+S,EAAa/S,OAASiT,EACtC7R,cACAgL,aACA+G,4BAKR,MAAMoC,EAAa,CACf7V,MAAOuG,EAAS8M,EAAarT,MAAOqT,EAAalb,MAAOkb,EAAa5M,yBACrEpB,QAAS7S,KAAK2f,SACd7R,MAAOA,GAAS+S,EAAa/S,OAASiT,EACtC7R,cACAgL,aACAtM,OAAQiT,EAAajT,OACrBC,YAAagT,EAAahT,YAC1BoM,cACAzL,qBAAmE,kBAAtCqS,EAAarS,qBAAqCqS,EAAarS,qBAAuBA,EACnHmN,sBACA2H,UAAWzC,EAAa1R,SA7GVmU,KACTnF,IACDA,EAAS0C,EAAa7S,KAAKmT,eAG1BN,EAAa1R,SAKG,YADAwP,EAAUkC,EAAc,CAAEjC,eAAe,IAEnD,IAGHiC,EAAahC,YAAcgC,EAAapf,MAAMxB,KAAKgD,IACvD,MAAMsgB,EAAQtgB,EAAO4d,EAAa1R,UAElC,IAAKoU,EACD,OAAO,KAGX,MAAMC,EAAMD,EAAMC,IACZpI,EAAMmI,EAAMnI,IACZrK,EAAI9N,EAAO4d,EAAaxT,MAE9B,MAAO,CACH0D,IACAwS,QAEAE,QAAS1S,EAAIoN,EAAOI,OAASJ,EAAOG,KAAOH,EAAOI,MAAQve,KAAKshB,QAAQ1N,YACvE8P,UAA0B,iBAARF,GAAoB,GAAOA,EAAMrF,EAAO7I,OAAS6I,EAAO5I,KAAO4I,EAAO7I,OAAStV,KAAKshB,QAAQzN,aAAe,KAC7H8P,UAA0B,iBAARvI,GAAoB,GAAOA,EAAM+C,EAAO7I,OAAS6I,EAAO5I,KAAO4I,EAAO7I,OAAStV,KAAKshB,QAAQzN,aAAe,KAChI,IA1BM,IAuGoC,MAG/C7T,KAAK0f,OACL1f,KAAK6f,aAAahG,KAAKiH,EAAeuC,GErMnC,SAAkBxO,GAAmB,MAChDrH,EAAK,MAAEM,EAAM,EAAC,QAAE+E,EAAO,YAAE3D,EAAY,QAAO,WAAEgL,EAAW,EAAC,OAAEtM,GAAO,EAAK,YAAEC,EAAY,KAAI,YAAEoM,GAAY,EAAK,qBAAEzL,GAAqB,EAAK,oBAAEmN,EAAmB,UAAE2H,IAE5JrJ,IACAnM,GAAS,GAEbA,Gf5BwB,Ee8BxB+E,EAAQ8K,YAAcnQ,EACtBqF,EAAQ+K,UAAY9P,EACpB+E,EAAQ3D,YAAcA,EACtB2D,EAAQqH,WAAaA,EAEjBtM,EACAiF,EAAQ+Q,YAAY/V,GAAe,CAAC,EAAG,IAEvCgF,EAAQ+Q,YAAY,IAGxB,MAAM7O,EAAQH,EAAUC,GAExB,IAAK,IAAImB,KAAQjB,EAAO,CACpBlC,EAAQgL,YAER,IAAK,IAAIrd,EAAI,EAAGA,EAAIwV,EAAK1V,OAAQE,IAAK,CAClC,MAAOuQ,EAAGO,GAAK0E,EAAKxV,GAEV,IAANA,EACAqS,EAAQiL,OAAO/M,EAAGO,GAElBuB,EAAQkL,OAAOhN,EAAGO,EAE1B,CAEAuB,EAAQmL,QACZ,CAEA,GAAIsF,EAAW,CACX,MAAMO,EAASP,IAEfzQ,EAAQ+K,UAAY9P,EACpB+E,EAAQ8K,YAAcnQ,EACtBqF,EAAQ+Q,YAAY,IACpB,MAAME,EAAqB,GAE3B,IAAK,IAAIP,KAASM,EAAQ,CACtB,IAAKN,EACD,SAGJ,MAAM,OAAEE,EAAM,UAAEC,EAAS,UAAEC,GAAcJ,EAGvB,OAAdG,IACA7Q,EAAQgL,YACRhL,EAAQiL,OAAO2F,EAAUK,EAAqB,EAAIJ,GAClD7Q,EAAQkL,OAAO0F,EAAUK,EAAqB,EAAIJ,GAClD7Q,EAAQmL,UAIM,OAAd2F,IACA9Q,EAAQgL,YACRhL,EAAQiL,OAAO2F,EAAUK,EAAqB,EAAIH,GAClD9Q,EAAQkL,OAAO0F,EAAUK,EAAqB,EAAIH,GAClD9Q,EAAQmL,UAGM,OAAd0F,GAAoC,OAAdC,IAK1B9Q,EAAQgL,YACRhL,EAAQiL,OAAO2F,EAAQC,GACvB7Q,EAAQkL,OAAO0F,EAAQE,GACvB9Q,EAAQmL,SACZ,CACJ,CAEA,GAAIxP,EAAsB,CACtBqE,EAAQiP,UAAYtU,EACpB,MAAMkO,EAAmBC,IAEzB,IAAK,IAAK5K,EAAGO,KAAMoK,EACf7I,EAAQgL,YACRhL,EAAQqQ,IAAInS,EAAGO,EAAGxD,EAAQ,EAAG,EAAG,EAAIqN,KAAKgI,IAAI,GAC7CtQ,EAAQmQ,MAEhB,CACJ,CF6GYe,CAASjD,EAAeuC,EAEhC,CAEAW,gBAAAA,CAAiBC,GACRA,IAIDjkB,KAAK0f,QACA1f,KAAKkkB,qBACNlkB,KAAKkkB,mBAAqB,IAAItH,EAAkB5c,KAAK2f,WAGzD3f,KAAKkkB,mBAAmBrK,KAAKoK,IGrO1B,UAAwB,KAAExiB,IAAQ,QAAEoR,IAC/C,MAAM/E,EAAQ+E,EAAQD,OAAO9E,MACvBiF,EAASF,EAAQD,OAAOG,OAE9B,IAAK,IAAI,MAAEgK,EAAK,MAAEC,EAAK,MAAExP,KAAW/L,EAChCoR,EAAQiP,UAAYtU,EACpBqF,EAAQmP,SAASjF,EAAMjP,EAAO,GAAIkP,EAAQD,GAAOjP,EAAOiF,EAEhE,CH+NYoR,CAAeF,EAAmB,CAC9BpR,QAAS7S,KAAK2f,WAG1B,CAMA,uBAAMM,GAMF,GALAjgB,KAAKshB,cAAgB3O,EAAW3S,KAAKyf,QAASzf,KAAK2f,UAEnD3f,KAAKyc,KAAK,eAAgBzc,KAAKshB,SAC/BthB,KAAKuf,iBAAiB6E,kBAElB9d,OAAO+d,eAAgB,CACvB,IAAIC,GAAQ,EACRC,GAAW,EAEfvkB,KAAKwgB,gBAAkB,IAAIla,OAAO+d,gBAAgB,KAC1CC,EACAA,GAAQ,EAIRC,IAIJA,GAAW,EACXvkB,KAAKmgB,SAASxK,MAAK,KACf4O,GAAW,CAAK,IAClB,IAGNvkB,KAAKwgB,gBAAgBxB,QAAQhf,KAAKyf,QAAQnY,WAC9C,CAEItH,KAAKwf,oBAAsBlZ,OAAOke,uBAClCxkB,KAAK0gB,sBAAwB,IAAIpa,OAAOke,sBAAsBC,IAC1D5Z,aAAa7K,KAAK0kB,sBAEbD,EAAQ,GAAGE,iBAIhB3kB,KAAK0kB,qBAAuBzZ,YAAW,KACnCjL,KAAKmgB,QAAQ,GACd,IAAG,GACP,CACCyE,UAAW,KAGf5kB,KAAK0gB,sBAAsB1B,QAAQhf,KAAKyf,QAAQnY,YAExD,CAEA,YAAM6Y,GACF,MAAM0E,EAAgBlS,EAAW3S,KAAKyf,QAASzf,KAAK2f,SAAU,CAAE7M,OAAO,IACvE9S,KAAKggB,aAAe6E,EAEpB7kB,KAAKshB,cAAgBthB,KAAKggB,aACtBhgB,KAAKggB,eAAiB6E,IAI1B7kB,KAAKyc,KAAK,eAAgBzc,KAAKshB,SAC/BthB,KAAKuf,iBAAiB6E,gBAAgBpkB,MAC1C,CAEA8kB,eAAAA,GACQ9kB,KAAK+kB,gBACLla,aAAa7K,KAAK+kB,gBAGtB/kB,KAAK+kB,eAAiB9Z,YAAW,KAC7BjL,KAAKmgB,SACLngB,KAAK+kB,eAAiB,IAAI,GAC3B,GACP,CAEAC,mBAAAA,GACShlB,KAAKshB,UAIVthB,KAAKshB,QAAQrO,aAAejT,KAAKyf,QAAQvM,wBAC7C,CAOA,gBAAID,GACA,OAAOjT,KAAKshB,SAASrO,YACzB,CAEA,UAAIuK,GACA,OAAOxd,KAAKshB,OAChB,EIlVG,SAAS2D,EAAmB1Z,GAC/B,OAAO4P,KAAKC,IAAmC,EAA9BD,KAAK+J,MAAM/J,KAAKgK,IAAI5Z,IAAa,EACtD,CAgBO,SAAS6Z,EAAiB7Z,EAAO8Z,EAAU,MAK9C,GAJkB,OAAdA,IACAA,EAAYJ,EAAmB1Z,IAG/B+Z,MAAMD,IAAcA,EAAY,IAChC,OAAO9Z,EAAMxL,WAGjB,MAAMwlB,EAAUha,EAAMia,QAAQrK,KAAKsK,KAAKJ,IACxC,IAAIK,EAAWH,EAKf,OAJIA,EAAQI,SAAS,OACjBD,EAAWA,EAASE,QAAQ,UAAW,KAG1B,KAAbF,EACO,IAGJA,CACX,CAEA,MAAMG,GAAuB,CAAC,EAU9B,SAASC,GAAmBC,EAAUC,GAClC,IACI,IAAIC,EAAoBJ,GAAqBE,GAC7C,IAAKE,EAAmB,CACpB,IAAIC,EAAiBH,EAChBA,GAAyB,UAAbA,IACbG,EAAiBC,KAAKC,iBAAiBC,kBAAkBN,UAG7DE,EAAoB,IAAIE,KAAKC,eAAe,QAAS,CACjDL,SAAUG,EACVI,aAAc,eAElBT,GAAqBE,GAAYE,CACrC,CAEA,MACMM,EADQN,EAAkBO,cAAcR,GACrBrE,MAAKrN,GAAsB,iBAAdA,EAAKnJ,OAE3C,IAAKob,EACD,OAAO,KAGX,GAAyB,QAArBA,EAAWhb,MACX,OAAO,EAGX,IAAK,uBAAuBkJ,KAAK8R,EAAWhb,OACxC,OAAO,KAGX,MAAOkb,EAAOC,GAAWH,EAAWhb,MAAMob,MAAM,GAAGtS,MAAM,KAEzD,OAAuB,GAAhBK,SAAS+R,GAAU,GAAG,IAAyB,GAAlB/R,SAASgS,GAAY,GAC7D,CAAE,MAAOhgB,GAGL,OAFA+Q,QAAQtL,MAAM,IAAI5J,MAAO,uCAAsCyjB,QAAiBD,MAChFtO,QAAQtL,MAAMzF,GACP,IACX,CACJ,CAWO,SAASkgB,GAAqBC,EAAMC,GACvC,IAAKA,EAAU,CACX,MAAMC,EAAa,IAAI/V,KAAK6V,GAE5B,OADAE,EAAWC,SAAS,EAAG,EAAG,EAAG,GACtBD,CACX,CAEA,MAAME,EAASnB,GAAmBgB,EAAUD,GAC5C,IAAIE,EAAa,IAAI/V,KAAK6V,GAU1B,OATAE,EAAWG,YAAY,EAAG,EAAG,EAAG,GAEbH,EAAWI,UAAYN,EAAKM,UAG9BF,IACbF,EAAa,IAAI/V,KAAK+V,EAAWI,UAAY,QAG1C,IAAInW,KAAK+V,EAAWI,UAAYF,EAC3C,CAmEO,SAASG,GAAQrW,GAAG,MAACsW,GAAM,EAAK,UAAEhC,EAAU,KAAI,SAAEiC,GAAS,EAAK,SAAEC,GAAS,EAAK,gBAAEC,GAAgB,EAAK,WAAEC,EAAW,MAAK,aAAEC,EAAY,SAAE3B,EAAQ,aAAE4B,GAAa,EAAK,eAAEC,GAAgB,CAAC,GAC3L,OAAIP,GAAWtW,aAAaC,OACxBD,EAAI,IAAIC,KAAKD,IAETuU,MAAMvU,IAKVA,aAAaC,KA1ErB,SAAoB6W,GAAM,UAACxC,EAAS,SAAEiC,EAAQ,SAAEC,EAAQ,gBAAEC,EAAe,aAAEE,EAAY,WAAED,EAAW,MAAK,SAAE1B,IACvG,MAAM+B,EAAM/B,GAAuC,QAA3BA,EAASgC,cACjC,GAAIhC,IAAa+B,GAAoB,UAAb/B,GAAwBzf,OAAO6f,MAAQ7f,OAAO6f,KAAKC,eAAgB,CACvF,MAAMa,EAASnB,GAAmBC,EAAU8B,GACtCG,EAAclC,GAAmB,QAAS+B,GAE1B,iBAAXZ,GAA8C,iBAAhBe,IACrCH,EAAO,IAAI7W,KAAK6W,EAAKV,UAAYF,EAASe,GAElD,CAEA,MAAMC,EAAOH,EAAMD,EAAKK,iBAAmBL,EAAKM,cAC1CC,GAASN,EAAMD,EAAKQ,cAAgBR,EAAKS,YAAc,EACvDC,EAAMT,EAAMD,EAAKW,aAAgBX,EAAKY,UAE5C,GAAqB,SAAjBf,EACA,OAAOO,EAAKloB,WAGhB,GAAIwnB,EACA,OAAOO,EAAO,GAAEM,KAASG,KAAON,IAASJ,EAAKa,qBAGlD,GAAIlB,EAGA,MAAQ,GADW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC5EY,EAAQ,MAAMG,IAGvC,MAAM9B,EAAQqB,EAAMD,EAAKc,cAAgBd,EAAKe,WACxClC,EAAUoB,EAAMD,EAAKgB,gBAAkBhB,EAAKiB,aAC5CC,EAAUjB,EAAMD,EAAKmB,gBAAkBnB,EAAKoB,aAC5CC,EAAepB,EAAMD,EAAKsB,qBAAuBtB,EAAKuB,kBAE5D,IAAIC,EAoBJ,OAjBIA,EADe,QAAf5B,EACc,KAAIhB,EAAQ,IAAM,GAAK,GAAG1mB,cAAc2mB,EAAQ3mB,WAAWupB,SAAS,EAAG,OAEvE,GAAE7C,EAAM1mB,WAAWupB,SAAS,EAAG,QAAQ5C,EAAQ3mB,WAAWupB,SAAS,EAAG,OAGtE,MAAdjE,GAAmC,OAAdA,IACrBgE,GAAe,IAAGN,EAAQhpB,WAAWupB,SAAS,EAAG,QAGnC,OAAdjE,IACAgE,GAAe,IAAGH,EAAanpB,WAAWupB,SAAS,EAAG,QAGvC,QAAf7B,IACA4B,GAAc5C,GAAS,GAAK,KAAO,MAGnCa,EACO+B,GAGPvB,IACAuB,GAAc,SAGVvB,EAAO,GAAEM,KAASG,KAAON,IAASJ,EAAKa,sBAAwB,IAAMW,EACjF,CAYeE,CAAWxY,EAAG,CAACsU,YAAWiC,WAAUC,WAAUC,kBAAiBE,eAAcD,aAAY1B,aAGhGT,MAAMvU,GACC,MAGP6W,EACIzM,KAAKgK,IAAIpU,EAAIoK,KAAKqO,MAAMzY,IAAM,MACvB,GAGJ6W,EAAezM,KAAKqO,MAAMzY,IAGjC4W,GAAgBxM,KAAKgK,IAAIpU,EAAIoK,KAAKqO,MAAMzY,IAAM,MACvC,GAGJqU,EAAiBrU,EAAGsU,GAxBZ,cAyBnB,CAEO,SAASoE,GAAQnY,GAAG,UAAC+T,EAAU,KAAI,IAAEqE,GAAI,GAAO,CAAC,GACpD,OAAU,OAANpY,EACO,OAGPgU,MAAMhU,GACC,MAGPoY,EACQ,MAAKtE,EAAiBjK,KAAK+J,MAAM5T,GAAI+T,KAG1CD,EAAiB9T,EAAG+T,EAC/B,CCxOO,MAAMsE,GAAe,G,uOCM5B,SAASC,IAAiB,OAAElc,EAAM,EAAE4D,EAAC,eAAEuY,IACnC,OAAIA,IAAmBnc,OACT5M,IAANwQ,EACO,YAGD,OAANA,EACO,OAGJA,EAAEvR,WAGS,iBAAX2N,EACHmc,EACOnc,EAAO3N,WAEP0pB,GAAQ/b,GAID,iBAAXA,EACA+b,GAAQnY,GAGZ5D,GAAU+b,GAAQnY,EAC7B,CAEA,SAASwY,IAAa,UAAEC,EAAS,EAAEhZ,EAAC,EAAEO,EAAC,OAAE7D,EAAM,OAAEC,EAAM,SAAEsc,EAAQ,QAAE7X,EAAO,mBAAElC,EAAkB,cAAEG,EAAa,cAAEC,EAAa,cAAEH,EAAa,cAAEC,EAAa,eAAE0Z,EAAc,eAAEI,IACxK,IAAIzpB,EAAI,EAER,OACI0pB,IAAAA,cAAA,SAEQja,GACAia,IAAAA,cAAA,QAAMnZ,EAAGiZ,EAAU1Y,EAAGa,EAAgB,GAAL3R,KAC5BupB,GAKL3Z,GACA8Z,IAAAA,cAAA,QAAMnZ,EAAGiZ,EAAU1Y,EAAGa,EAAkB,GAAP3R,KAC5B0P,GAAiB,MAAOzC,GAAU2Z,GAAQrW,EAAGkZ,IAKlD5Z,GACA6Z,IAAAA,cAAA,QAAMnZ,EAAGiZ,EAAU1Y,EAAGa,EAAkB,GAAP3R,KAC5B2P,GAAiB,MAAOyZ,GAAiB,CAAElc,SAAQ4D,IAAGuY,oBAK3E,CAEAC,GAAaK,UAAY,CACrBJ,UAAW/lB,IAAAA,OACX+M,EAAG/M,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,WAAqBgN,QAC/DM,EAAGtN,IAAAA,OACHyJ,OAAQzJ,IAAAA,OACR0J,OAAQ1J,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,SAC/CgmB,SAAUhmB,IAAAA,OAAiBtB,WAC3ByP,QAASnO,IAAAA,OAAiBtB,WAC1BmnB,eAAgB7lB,IAAAA,KAChBimB,eAAgBjmB,IAAAA,UACbomB,EAAgBpa,mBAGR,MAAMqa,WAAgBH,IAAAA,cAEjCtJ,MAAAA,GAEI,IAAI7N,EAAS,GAER/S,KAAKgC,MAAMiO,qBACZ8C,GAAU,IAGT/S,KAAKgC,MAAMoO,gBACZ2C,GAAU,IAGT/S,KAAKgC,MAAMqO,gBACZ0C,GAAU,IAGd,MACMuX,EAAavX,EAAO,EAGpBZ,EAnBc,EAmBHmY,EAEXL,EAAiB,CACnBxC,WAAYznB,KAAKgC,MAAMylB,WACvB1B,SAAU/lB,KAAKgC,MAAM+jB,UAGnBwE,EAAmB,CACrBta,mBAAoBjQ,KAAKgC,MAAMiO,mBAC/BC,cAAelQ,KAAKgC,MAAMkO,cAC1BC,cAAenQ,KAAKgC,MAAMmO,cAC1BC,cAAepQ,KAAKgC,MAAMoO,cAC1BC,cAAerQ,KAAKgC,MAAMqO,cAC1B4Z,kBAGEO,EAAmBxqB,KAAKgC,MAAMyoB,SAASxqB,KAAKyqB,IAC9C,MAAM,EAAE3Z,EAAC,EAAEO,EAAC,OAAEqZ,EAAM,OAAElH,EAAM,OAAElU,EAAM,MAAE5J,EAAK,OAAE8H,EAAM,OAAEC,EAAM,eAAEmc,GAAmBa,EAEhF,GAAsB,iBAAXjH,EACP,OAAO,KAGX,MAAMsG,GAAaxa,EAAO/M,MAAQ+M,EAAOjC,MAAQ3H,GAAO5F,WACxD,IAAI+N,EAAmJ,IAA3IqN,KAAKC,IAAI2O,EAAUzpB,QAASmN,GAAU2Z,GAAQrW,EAAGkZ,IAAiB3pB,OAAS,EAAGspB,GAAiB,CAAElc,SAAQ4D,IAAGuY,mBAAiBvpB,OAAS,GAC9IiP,EAAOP,eACPlB,EAAQyB,EAAOP,cAGnB,IAAI4b,EAAgB5qB,KAAKgC,MAAM0R,aAAgB5F,EAAQ,GAAc,EAEjE+c,EAAa,EACbpH,GAAUzjB,KAAKgC,MAAM0R,cAAgB5F,EAAQ,GAlChC,KAmCb+c,GAAc,GAGdpH,EAAS3V,EAAQ,GAtCJ,IAsCkD,IAAhB+c,IAC/CD,GAAgB,GAGV,OAANtZ,IACAsZ,GAAgB,GAGhB5qB,KAAKgC,MAAMuO,sBACXqa,GAAgB,GAGpB,IAAIZ,EAAWc,GAOf,GANID,EAAa,EACbb,GAAYlc,EAAQkc,EAEpBA,GAAY,GAGXe,SAAStH,GACV,OAAO,KAGX,MAAMuH,EAAa,aAAYvH,KAAUkH,KAEnCM,EAAmB,CACrBpB,eAAgBA,GAAkB7pB,KAAKgC,MAAMkpB,aAC7Cna,IACAO,IACAyY,YACAtc,SACAC,YACG6c,GAGP,IACIY,EADAC,EAAe,EA2BnB,OAxBIR,IACAZ,EAAW,EAEXmB,EAAWnrB,KAAKgC,MAAM0R,aAAe,EAAI5F,EAAQ,EAE7CA,EAAQ9N,KAAKgC,MAAM0R,eAAiB1T,KAAKgC,MAAMsO,WAC/C6a,GAAYxB,GAAe3pB,KAAKgC,MAAMqpB,UAAY,GAGtDD,EAAe,GAEXprB,KAAKgC,MAAMsO,WAEP8a,EAD6B,WAA7BprB,KAAKgC,MAAMwO,cACIxQ,KAAKgC,MAAM2R,cAAgB2W,EAAa,GAEvCvX,EAGhB/S,KAAKgC,MAAMyO,aACX2a,GAAgBprB,KAAKgC,MAAMyO,cAKhC,IACAia,EACHhb,MAAOqa,EACPlI,YAAatS,GAAQvB,MAAMuB,QAAQ2S,QAAQ3S,GAC3Cwa,YACAjc,QACA8c,gBACAC,aACAb,WACAgB,YACAC,mBACA9Y,UACAY,SACA+X,UAnHU,EAoHVR,aACAgB,aAnHa,EAoHbF,eACAD,WACH,IACF5K,OAAOgL,SAEJC,EAAyBxrB,KAAKgC,MAAM2O,cAE1C,IAAI8a,EACJ,GAAIzrB,KAAKgC,MAAM4O,gBAAiB,CAC5B,IAAI8a,EAAuB,GACe,iBAA/B1rB,KAAKgC,MAAM4O,kBAClB8a,EAAuB1rB,KAAKgC,MAAM4O,iBAGtC6a,EAAkB,GAElB,IAAK,IAAIf,KAAWF,EAAkB,CAClC,IAAImB,GAAQ,EACZ,IAAK,IAAIC,KAASH,EACd,GAAItQ,KAAKgK,IAAIyG,EAAMnI,OAASiH,EAAQjH,SAAWiI,EAAsB,CACjEE,EAAMnB,SAAShrB,KAAKirB,GAChBA,EAAQjH,OAASmI,EAAMnI,SACvBmI,EAAMnI,OAASiH,EAAQjH,OACvBmI,EAAMf,WAAaH,EAAQG,YAG3BH,EAAQC,OAASiB,EAAMjB,SACvBiB,EAAMjB,OAASD,EAAQC,QAG3BgB,GAAQ,EACR,KACJ,CAGCA,GACDF,EAAgBhsB,KAAK,CACjBgkB,OAAQiH,EAAQjH,OAChBkH,OAAQD,EAAQC,OAChBE,WAAYH,EAAQG,WACpBJ,SAAU,CAACC,IAGvB,CAEA,IAAK,IAAIkB,KAASH,EAAiB,CAC/B,IAAII,EAAc,EACdC,EAAW,EAGfF,EAAMnB,SAASsB,MAAK,CAACxjB,EAAGkD,IAAMlD,EAAEsZ,YAAcpW,EAAEoW,cAEhD,IAAK,IAAIrhB,EAAI,EAAGA,EAAIorB,EAAMnB,SAASnqB,OAAQE,IACvCorB,EAAMnB,SAASjqB,GAAG2R,QAAU0Z,EAC5BA,GAAeD,EAAMnB,SAASjqB,GAAGuS,OACjC+Y,EAAW3Q,KAAKC,IAAI0Q,EAAUF,EAAMnB,SAASjqB,GAAGsN,OAGpD,IAAK,IAAItN,EAAI,EAAGA,EAAIorB,EAAMnB,SAASnqB,OAAQE,IACvCorB,EAAMnB,SAASjqB,GAAG2R,SAAW0Z,EAAY,EACzCD,EAAMnB,SAASjqB,GAAG2R,SAjMV,EAoMZyZ,EAAM7Y,OAAS8Y,EACfD,EAAMtB,WAAauB,EAAc,EACjCD,EAAMd,UAvLI,EAwLVc,EAAM9d,MAAQge,CAClB,CACJ,CAEA,OACI5B,IAAAA,cAAA,OAAK8B,UAAU,mBACX9B,IAAAA,cAAA,WAEQM,EAAiBvqB,KAAI,CAACyqB,EAASlqB,KAC3B,MAAM,MAAEgN,EAAK,cAAEod,EAAa,MAAE9c,EAAK,UAAEkd,EAAS,SAAEG,EAAQ,iBAAEF,EAAgB,aAAEG,EAAY,WAAEP,EAAU,SAAEb,EAAQ,QAAE7X,GAAYuY,EAE5H,OAAI1qB,KAAKgC,MAAM2O,eAAiB8a,EAExBvB,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwqB,UAAWA,EAAWgB,UAAU,gBACvC9B,IAAAA,cAAA,UAAQ9e,EAAG,EAAG4X,KAAMxV,KAM5Bod,EAEIV,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwrB,UAAU,mCACjB9B,IAAAA,cAAA,UAAQ9e,EAAG,EAAG4X,KAAMxV,EAAOwd,UAAWA,IAEtCd,IAAAA,cAAA,KAAGc,UAAY,aAAYG,MAAaC,MACpClB,IAAAA,cAAA,QAAMlM,OAAQxQ,EAAOlF,EAAI,UAASgiB,MAAexc,MAAUwc,OAAgBxc,SAE3Eoc,IAAAA,cAACJ,GAAYmC,GAAA,CACTjC,SAAUA,EAAU7X,QAASA,GACzB8Y,MAQpBf,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwqB,UAAWA,EAAWgB,UAAU,gBACvC9B,IAAAA,cAAA,UAAQ9e,EAAG,EAAG4X,KAAMxV,IAEpB0c,IAAAA,cAAA,QAAMlM,OAAQxQ,EAAOlF,EAAI,IA/NhC,EA+NmCuiB,QAjOtC,EAiOoEA,EAAqB,UAAqBP,MAAeO,EAAW/c,MAAUwc,MAAeO,GAAY/c,SA/N1K,EA+NkM+c,QAE3LX,IAAAA,cAACJ,GAAYmC,GAAA,CACTjC,SAAUA,EAAU7X,QAASA,GACzB8Y,IAER,KAMXjrB,KAAKgC,MAAM2O,eAAiB8a,GAC7BA,EAAgBxrB,KAAI,EAAGwqB,WAAUhH,SAAQkH,SAAQL,aAAYO,aAAYrd,QAAOM,SAAStN,IACrF0pB,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwqB,UAAY,aAAYvH,KAAUkH,KAAWqB,UAAU,gBAC9D9B,IAAAA,cAAA,QAAMlM,OAAQxQ,EAAOlF,EAAI,IA9O5B,EA8O+BuiB,QAhPlC,EAgPgEA,EAAqB,UAAqBP,MAAeO,EAAW/c,MAAUwc,MAAeO,GAAY/c,SA9OtK,EA8O8L+c,QAGvLJ,EAASxqB,KAAI,CAACyqB,EAAS5e,IACnBoe,IAAAA,cAACJ,GAAYmC,GAAA,CACTxjB,IAAKqD,EACLqG,QAASuY,EAAQvY,QACjB6X,SAAUU,EAAQV,UACdU,EAAQO,yBAUpCjrB,KAAKgC,MAAM2O,gBACV8a,GAAmBjB,GAAkBvqB,KAAI,CAACyqB,EAASlqB,IAChD0pB,IAAAA,cAAA,OACIzhB,IAAKjI,EACLwrB,UAAU,2BACV/lB,MAAO,CAACimB,IAAKxB,EAAQC,OAAQwB,KAAMzB,EAAQjH,SAE3CyG,IAAAA,cAACsB,EAA2Bd,MAMpD,EAIJL,GAAQ+B,aAAe,CACnBnc,oBAAoB,EACpBC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,eAAe,GAGnBga,GAAQF,UAAY,CAChBkC,OAAQroB,IAAAA,OAAiBtB,WACzB4pB,OAAQtoB,IAAAA,OAAiBtB,WACzBiR,cAAe3P,IAAAA,OAAiBtB,WAChCgR,aAAc1P,IAAAA,OAAiBtB,WAC/B+nB,SAAUzmB,IAAAA,QAAkBA,IAAAA,MAAgB,CACxC+M,EAAG/M,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,WAAqBgN,QAC/DM,EAAGtN,IAAAA,OACH2mB,OAAQ3mB,IAAAA,OACRwJ,MAAOxJ,IAAAA,OACPyJ,OAAQzJ,IAAAA,OACR0J,OAAQ1J,IAAAA,IACR6lB,eAAgB7lB,IAAAA,QAEpBqnB,UAAWrnB,IAAAA,OAAiBtB,WAC5BwoB,aAAclnB,IAAAA,KAAetB,WAC7B+kB,WAAYzjB,IAAAA,MAAgB,CAAC,MAAO,QACpC+hB,SAAU/hB,IAAAA,UACPomB,EAAgBpa,mBCxYR,MAAMuc,WAAoBrC,IAAAA,cACrC5R,WAAAA,CAAYtW,GACRsd,MAAMtd,GACNhC,KAAKwsB,WAAaxsB,KAAKwsB,WAAWthB,KAAKlL,KAC3C,CAEAwsB,UAAAA,CAAWC,GAGP,GAFAzsB,KAAK0sB,QAAUD,EAEXzsB,KAAKgC,MAAM2qB,YAAYC,SAAW5sB,KAAK0sB,QAAS,CAChD,MAAMnJ,EAAQnd,SAASymB,cACjBC,EAAYxmB,OAAOymB,eAEzBD,EAAUE,kBAEVzJ,EAAM0J,mBAAmBjtB,KAAK0sB,SAC9BI,EAAUI,SAAS3J,GACnBvjB,KAAK0sB,QAAQS,OACjB,CACJ,CAEAC,cAAAA,CAAeC,GACX,MAAOC,EAAUC,GAAYF,EAAYhZ,MAAM,OAExC+T,EAAOG,EAAKN,GAAQqF,EAASjZ,MAAM,KACpCmZ,EAAiB,GAAEpF,EAAMkB,SAAS,EAAG,QAAQf,EAAIe,SAAS,EAAG,QAAQrB,KAEpEJ,EAAM4F,GAAUF,EAASlZ,MAAM,MAC/BoS,EAAOC,GAAWmB,EAAKxT,MAAM,KAIpC,MAAQ,GAAEmZ,KAHa/G,EAAM6C,SAAS,EAAG,QACE5C,KAAW+G,GAG1D,CAEA7M,MAAAA,GACI,MAAM,EAAE7P,EAAC,EAAEO,EAAC,QAAEsb,EAAO,MAAErhB,GAAUvL,KAAKgC,MAAM2qB,YAEtC1mB,EAAQ,CAAEkmB,KAAMpb,EAAGmb,IAAK5a,EAAGxD,MAAO,SAExC,IAAK8e,IAAYrhB,GAAoC,iBAA3BA,EAAMmiB,kBAAuCpI,MAAMvU,IAAMuU,MAAMhU,GACrF,OAAO,KAGX,MAAMqc,EAAepiB,aAAiByF,KAAOhR,KAAKotB,eAAe7hB,EAAMmiB,kBAAoBniB,EAC3F,OACI2e,IAAAA,cAAA,OAAK8B,UAAU,uBAAuB/lB,MAAOA,GACzCikB,IAAAA,cAAA,OAAK8B,UAAU,aACX9B,IAAAA,cAAA,OAAK8B,UAAU,YAAY4B,WAAW,EAAMnB,IAAKzsB,KAAKwsB,YACjDmB,IAKrB,EC/CW,SAASE,GAAwBhN,EAAcvc,EAAQ,CAAC,GACnE,MAAM6G,EAAOwT,EAAUkC,EAAc,CAAEjC,eAAe,EAAMnd,KAAM6C,EAAQ7C,OAC1E,IAAKwL,EAAkB0Y,SAASxa,GAC5B,MAAM,IAAI5I,MAAO,oBAAmB4I,8BAGxC,MAAMkW,EAAc,CAChByM,OAAQC,GACRC,OAAQC,GACRC,QAASC,IACXhjB,GAAM7G,EAAQ7C,MAAQof,EAAahC,YAAcgC,EAAapf,KAAMof,EAAcvc,GAEpF,GAAIuc,EAAa1S,OAAQ,CACrB,MAAMA,EAAS,GACf,IAAIqH,EAAQlR,EAAQkR,MACpB,IAAK,IAAIoM,KAASP,OACAvgB,IAAV0U,GACArH,EAAO1O,KAAK,CAACmiB,EAAM,GAAIpM,IAE3BrH,EAAO1O,KAAKmiB,GACZpM,EAAQoM,EAAM,GAGlB,OAAOzT,CACX,CAEA,GAAI0S,EAAazS,SACb,IAAK,IAAIwT,KAASP,EACd,GAAwB,iBAAbO,EAAM,GAAiB,CAC9B,MAAMwM,EAAiBxM,EAAM,GAC7BA,EAAM,GAAK,IAAI5Q,KAAK,IAAIA,KAAK4Q,EAAM,IAAIuF,UAAYtG,EAAazS,UAC5DkX,MAAM1D,EAAM,MACZA,EAAM,GAAKtd,EAAQ4a,gBAAgBmP,aAAaD,EAAgBvN,GAExE,MAAWe,EAAM,aAAc5Q,KAC3B4Q,EAAM,GAAK,IAAI5Q,KAAK4Q,EAAM,GAAGuF,UAAYtG,EAAazS,UAC3B,iBAAbwT,EAAM,KACpBA,EAAM,IAAMf,EAAazS,UAKrC,GAAIyS,EAAatT,WACb,IAAK,IAAIqU,KAASP,EACU,iBAAbO,EAAM,KACbA,EAAM,GAAK,IAAI5Q,KAAc,IAAT4Q,EAAM,KAKtC,OAAOP,CACX,CAYA,SAAS4M,GAAkBxsB,EAAMof,EAAcvc,GAC3C,MAAM+c,EAAc,GAEpB,IAAK,IAAI7gB,EAAI,EAAGA,EAAIiB,EAAKnB,OAAQE,IAAK,CAClC,IAAI8tB,EAAS7sB,EAAKjB,GAEI,iBAAX8tB,IACPA,EAAShqB,EAAQ4a,gBAAgBmP,aAAaC,EAAQzN,IAGpC,kBAAXyN,IACPA,GAAUA,GAGdjN,EAAY5hB,KAAK,CAACe,GAAK8D,EAAQiqB,aAAe,GAAID,GACtD,CAEA,OAAOjN,CACX,CAWA,SAAS0M,GAAkBtsB,EAAMof,EAAcvc,GAC3C,MAAO,IAAI7C,EAAKxB,KAAI,EAAGuuB,EAAQF,MAK3B,QAJextB,IAAXwtB,IACAA,EAAS,MAGS,iBAAXE,EAAqB,CAC5B,MAAMJ,EAAiBI,EACvBA,EAAS,IAAIxd,KAAKwd,GAEdlJ,MAAMkJ,KACNA,EAASlqB,EAAQ4a,gBAAgBmP,aAAaD,EAAgBvN,GAAc,GAEpF,CAUA,MARsB,iBAAXyN,IACPA,EAAShqB,EAAQ4a,gBAAgBmP,aAAaC,EAAQzN,IAGpC,kBAAXyN,IACPA,GAAUA,GAGP,CAACE,EAAQF,EAAO,IAE/B,CAEA,SAASG,GAAsBC,EAAMzH,EAAQthB,GACzC,MAAMqiB,EAAc0G,EAAKC,UAAU1H,EAAS,EAAI3Q,YAAYsY,kBAAkBjpB,GAAO,GAErF,GAAoB,IAAhBqiB,EACA,OAAO,KAGX,MAAM7c,EAAOujB,EAAKG,SAAS7G,GAE3B,GAAa,IAAT7c,EACA,OAAOujB,EAAKI,WAAW7H,EAASe,EAAc,GAAG,GAC9C,GAAa,IAAT7c,GAAuB,IAATA,EACrB,OAAO,KACJ,GAAa,IAATA,EACP,OAAO,IAAI6F,KAAK0d,EAAKI,WAAW7H,EAASe,EAAc,GAAG,IAE1D,MAAM,IAAIzlB,MAAO,sBAAqB4I,kBAE9C,CAWA,SAASgjB,GAAmB1sB,EAAM8N,EAAQjL,GACtC,IAAKiL,EAAOlC,MAA+B,iBAAhBkC,EAAOlC,KAC9B,MAAM,IAAI9K,MAAM,uCAGpB,IAAKgN,EAAOjC,MAA+B,iBAAhBiC,EAAOjC,KAC9B,MAAM,IAAI/K,MAAM,uCAGpB,MAAM8e,EAAc,GAEpB,IAAK,IAAI0N,KAASttB,EACd,GAAIstB,EAAMC,kBAAkBC,YAAa,CACrC,MAAMP,EAAO,IAAIQ,SAASH,EAAMC,QAC1BG,EAASJ,EAAMK,SAAS7f,EAAOlC,MAC/BgiB,EAASN,EAAMK,SAAS7f,EAAOjC,MAErC,IAAK,IAAI2Z,KAAU8H,EAAMO,QACrBjO,EAAY5hB,KAAK,CAACgvB,GAAsBC,EAAMzH,EAAQkI,GAASV,GAAsBC,EAAMzH,EAAQoI,IAE3G,MAAO,GAAIvQ,MAAMC,QAAQgQ,EAAMxf,EAAOjC,OAClC,GAAIyhB,EAAMxf,EAAOjC,MAAMhN,SAAWwe,MAAMC,QAAQgQ,EAAMxf,EAAOjC,MAAM,KAAwC,iBAA1ByhB,EAAMxf,EAAOjC,MAAM,GAChG,IAAK,IAAIiiB,KAAYR,EAAMxf,EAAOjC,MAAO,CACrC,IAAIghB,EAASiB,EAAShgB,EAAOjC,WACdxM,IAAXwtB,IACAA,EAAS,MAGS,iBAAXA,IACPA,EAAShqB,EAAQ4a,gBAAgBmP,aAAaC,EAAQ/e,IAGpC,kBAAX+e,IACPA,GAAUA,GAGd,IAAIE,EAASe,EAAShgB,EAAOlC,MACP,iBAAXmhB,IACPA,EAAS,IAAIxd,KAAKwd,IAGtBnN,EAAY5hB,KAAK,CAAC+uB,EAAQF,GAC9B,MAEAjN,EAAY5hB,QAAQsvB,EAAMxf,EAAOjC,WAElC,CACH,IAAIghB,EAASS,EAAMxf,EAAOjC,WACXxM,IAAXwtB,IACAA,EAAS,MAGb,IAAIE,EAASO,EAAMxf,EAAOlC,MACJ,iBAAXmhB,IACPA,EAAS,IAAIxd,KAAKwd,IAGA,iBAAXF,IACPA,EAAShqB,EAAQ4a,gBAAgBmP,aAAaC,EAAQ/e,IAGpC,kBAAX+e,IACPA,GAAUA,GAGdjN,EAAY5hB,KAAK,CAAC+uB,EAAQF,GAC9B,CAGJ,OAAOjN,CACX,CCpOA,SAASmO,GAAerR,GAAQ,MAAEkJ,IAC9B,MAAMoI,EAA2B,OAAhBtR,EAAOI,MAAiC,OAAhBJ,EAAOG,MAAkC,OAAhBH,EAAO7I,MAAiC,OAAhB6I,EAAO5I,KAEjG,IAAK,IAAI9M,KAAOE,OAAOQ,KAAKgV,GACG,iBAAhBA,EAAO1V,KACd0V,EAAO1V,GAAO,GAOtB,OAHA0V,EAAOsR,QAAUA,EACjBtR,EAAOkJ,MAAQA,EAERlJ,CACX,CAsCe,SAASuR,GAAoBrO,GAAa,WAACsO,EAAW,IAAG,oBAAEC,EAAoB,GAAG,CAAC,GAC9F,IAAIzR,EAAS,CACTI,KAAM,KACND,KAAM,KACNhJ,KAAM,KACNC,KAAM,KACN2I,eAAgB,MAGpB,GAAmB,MAAfyR,GAAsBtO,EAAY/gB,OAClC,OA9CR,SAA0B+gB,EAAalD,GAAQ,WAACwR,EAAW,IAAG,oBAAEC,EAAoB,GAAG,CAAC,GACpF,IAAIvI,GAAQ,EAEZlJ,EAAOI,KAAO8C,EAAY,GAAG,GACzBlD,EAAOI,gBAAgBvN,OACvBmN,EAAOI,KAAOJ,EAAOI,KAAK4I,UAC1BE,GAAQ,GAGZlJ,EAAOG,KAAO+C,EAAYA,EAAY/gB,OAAS,GAAG,GAC9C6d,EAAOG,gBAAgBtN,OACvBmN,EAAOG,KAAOH,EAAOG,KAAK6I,UAC1BE,GAAQ,GAGZ,MAAMwI,EAAYxO,EACbd,QAAO,EAAEuP,EAAIxe,KAAoB,iBAANA,IAC3Bya,MAAK,EAAEgE,EAAKC,IAAMC,EAAKC,KAAQF,EAAKE,IAEzC,IAAKL,EAAUvvB,OACX,OAAOkvB,GAAerR,EAAQ,CAACkJ,UAGnC,MAAM8I,EAAYhV,KAAKqI,IAAIrI,KAAKgK,IAAIyK,IAAuB,IAAID,GAAY,IAAMC,EAAsB,GAAK,EAAI,GAC1GQ,GAAsB,IAAIT,GAAY,EAAIQ,EAC1CE,GAAmB,IAAIV,GAAY,EAAIQ,EAEvCG,EAAanV,KAAKoV,OAAOV,EAAUvvB,OAAO,GAAG8vB,EAAmB,KAChEI,EAAWrV,KAAKoV,OAAOV,EAAUvvB,OAAO,IAAI,IAAI+vB,GAAiB,KAKvE,OAHAlS,EAAO7I,KAAOua,EAAUS,GAAY,GACpCnS,EAAO5I,KAAOsa,EAAUW,GAAU,GAE3BhB,GAAerR,EAAQ,CAACkJ,SACnC,CAYeoJ,CAAiBpP,EAAalD,EAAQ,CAACwR,aAAYC,wBAG9D,IAAIvI,GAAQ,EACRxQ,EAAQ,KAEZ,IAAK,IAAK9F,EAAGO,KAAM+P,EAAa,CAc5B,GAbItQ,aAAaC,OACbD,EAAIA,EAAEoW,UACNE,GAAQ,IAGe,iBAAhBlJ,EAAOI,MAAqBxN,EAAIoN,EAAOI,QAC9CJ,EAAOI,KAAOxN,IAGS,iBAAhBoN,EAAOG,MAAqBvN,EAAIoN,EAAOG,QAC9CH,EAAOG,KAAOvN,GAGG,iBAAV8F,GAAmC,iBAAN9F,EAAgB,CACpD,MAAM2f,EAAU3f,EAAI8F,GACiB,iBAA1BsH,EAAOD,gBAA+BwS,EAAUvS,EAAOD,kBAC9DC,EAAOD,eAAiBwS,EAEhC,CACA7Z,EAAQ9F,EAES,iBAANO,KAIgB,iBAAhB6M,EAAO7I,MAAqBhE,EAAI6M,EAAO7I,QAC9C6I,EAAO7I,KAAOhE,IAGS,iBAAhB6M,EAAO5I,MAAqBjE,EAAI6M,EAAO5I,QAC9C4I,EAAO5I,KAAOjE,GAEtB,CAEA,OAAOke,GAAerR,EAAQ,CAACkJ,SACnC,CCvGe,SAASsJ,GAAYC,GAChC,MAAMC,EAAe,CACjBtS,KAAM,KACND,KAAM,KACNhJ,KAAM,KACNC,KAAM,KACN2I,eAAgB,KAChBmJ,OAAO,EACPoI,SAAS,GAGb,IAAK,IAAI,KAAElR,EAAI,KAAED,EAAI,KAAEhJ,EAAI,KAAEC,EAAI,MAAE8R,EAAK,QAAEoI,EAAO,eAAEvR,KAAoB0S,EAC/DvJ,IACAwJ,EAAaxJ,OAAQ,GAGrBoI,IAGJoB,EAAapB,SAAU,GAEG,OAAtBoB,EAAatS,MAAiBA,EAAOsS,EAAatS,QAClDsS,EAAatS,KAAOA,IAGE,OAAtBsS,EAAavS,MAAiBA,EAAOuS,EAAavS,QAClDuS,EAAavS,KAAOA,IAGY,OAAhCuS,EAAa3S,gBAA2BA,EAAiB2S,EAAa3S,kBACtE2S,EAAa3S,eAAiBA,IAGR,OAAtB2S,EAAavb,MAAiBA,EAAOub,EAAavb,QAClDub,EAAavb,KAAOA,IAGE,OAAtBub,EAAatb,MAAiBA,EAAOsb,EAAatb,QAClDsb,EAAatb,KAAOA,IAwB5B,OApB0B,OAAtBsb,EAAatS,OACbsS,EAAatS,KAAO,GAGE,OAAtBsS,EAAavS,OACbuS,EAAavS,KAAO,GAGY,OAAhCuS,EAAa3S,iBACb2S,EAAa3S,eAAiB,GAGR,OAAtB2S,EAAavb,OACbub,EAAavb,KAAO,GAGE,OAAtBub,EAAatb,OACbsb,EAAatb,KAAO,GAGjBsb,CACX,CCnDe,SAASC,GAAa3S,GAAQ,YAAClQ,EAAc,GAAE,gBAAE8iB,EAAgB,IAC5E,MAAMC,EAAiBroB,OAAOsoB,OAAO,CAAC,EAAG9S,GACzC,IAAK,IAAI7M,KAAKrD,EACNqD,WAI+B,iBAAxB0f,EAAe1b,MAAqBhE,EAAI0f,EAAe1b,QAC9D0b,EAAe1b,KAAOhE,IAGS,iBAAxB0f,EAAezb,MAAqBjE,EAAI0f,EAAezb,QAC9Dyb,EAAezb,KAAOjE,IAI9B0f,EAAeE,aAAeF,EAAe1b,KAC7C0b,EAAeG,aAAeH,EAAezb,KAE7C,MAAMgO,EAAQyN,EAAezb,KAAOyb,EAAe1b,KAC7C8b,EAAWJ,EAAe1b,KAAOiO,EAAM,EAiB7C,GAhBAyN,EAAe1b,KAAO8b,EAAW,KAAK7N,EAAM,EAC5CyN,EAAezb,KAAO6b,EAAW,KAAK7N,EAAM,EAExCyN,EAAe1b,OAAS0b,EAAezb,MAAgC,OAAxByb,EAAe1b,OAC1D0b,EAAe1b,KAAO,GACtB0b,EAAe1b,MAAQ,IACvB0b,EAAezb,MAAQ,MAChByb,EAAe1b,KAAO,GAC7B0b,EAAe1b,MAAQ,KACvB0b,EAAezb,MAAQ,MAEvByb,EAAe1b,MAAQ,EACvB0b,EAAezb,MAAQ,IAI3Bwb,GAAmBC,EAAezS,OAASyS,EAAe1S,MAAgC,OAAxB0S,EAAezS,MAAyC,OAAxByS,EAAe1S,KAAe,CAEhI,MAAMG,GAAYuS,EAAe1S,KAAO0S,EAAezS,MAAQwS,EAC/DC,EAAezS,MAAQE,EAAS,EAChCuS,EAAe1S,MAAQG,EAAS,CACpC,CAEA,OAAOuS,CACX,CC7Ce,SAASK,GAAa5vB,EAAM6vB,EAASC,EAAa,CAAC,EAAGjB,EAAW,EAAGE,OAAS1vB,GAKxF,QAJiBA,IAAb0vB,IACAA,EAAW/uB,EAAKnB,OAAS,GAGT,IAAhBmB,EAAKnB,OACL,OAAOixB,EAAaC,aAAe,EAAI,CAAC,KAAM,MAGlD,MAAMC,EAActW,KAAKoV,OAAOD,EAAaE,GAAU,GAEvD,GAAIc,IAAY7vB,EAAKgwB,GAAa,IAAOhwB,EAAKgwB,GAAa,aAAczgB,MAAQvP,EAAKgwB,GAAa,GAAGtK,YAAcmK,EAChH,OAAIC,EAAaC,YACNC,EAEAhwB,EAAKgwB,GAIpB,GAAInB,IAAeE,EACf,OAAI/uB,EAAK6uB,GAAY,GAAKgB,GAAuC,WAA5BC,EAAaG,YAEvCjwB,EAAK6uB,GAAY,GAAKgB,GAAuC,UAA5BC,EAAaG,WAD9CH,EAAaC,YAAclB,EAAa7uB,EAAK6uB,GAI7CiB,EAAaC,aAAe,EAAI,CAAC,KAAM,MAItD,GAAIhB,EAAW,IAAMF,EAAY,CAC7B,IAAI3qB,EAcJ,OAXIA,EAD4B,WAA5B4rB,EAAaG,WACLpB,EAE2B,UAA5BiB,EAAaG,YAIZvW,KAAKgK,IAAI1jB,EAAK6uB,GAAY,GAAKgB,GAAWnW,KAAKgK,IAAI1jB,EAAK+uB,GAAU,GAAKc,GAHvEd,EAKJF,EAGDiB,EAAaC,YAAc7rB,EAAQlE,EAAKkE,EACnD,CAEA,OAAI2rB,EAAU7vB,EAAKgwB,GAAa,GACrBJ,GAAa5vB,EAAM6vB,EAASC,EAAcE,EAAajB,GAG9Dc,EAAU7vB,EAAKgwB,GAAa,GACrBJ,GAAa5vB,EAAM6vB,EAASC,EAAcjB,EAAYmB,QADjE,CAGJ,CCnBe,SAASE,IAAyB,KAAElwB,EAAI,KAAEmwB,EAAI,KAAErT,EAAI,KAAED,EAAI,sBAAE3Q,EAAqB,OAAEQ,IAC9F,IAAK1M,EAAKnB,QAAUmB,EAAKnB,QAAUie,EAAO9c,EAAKA,EAAKnB,OAAS,GAAG,IAAMmB,EAAKnB,QAAUge,EAAO7c,EAAK,GAAG,GAEhG,MAAO,CACHA,KAAM,CACF,CAAC8c,EAAM,MACP,CAACD,EAAM,OAEXuT,YAAY,EACZC,WAAW,GAKnB,IAcI1Q,EAdA2Q,EAAcV,GAAa5vB,EAAM8c,EAAM,CAAEmT,WAAY,SAAUF,aAAa,KAAW,EACvFQ,EAAaX,GAAa5vB,EAAM6c,EAAM,CAAEoT,WAAY,QAASF,aAAa,KAAW,EAKzF,KAJoB,IAAhBQ,IACAA,EAAa,GAGVD,GAAe,GAAKtwB,EAAKswB,GAAa,IAAMxT,GAC/CwT,IAGJ,KAAOC,EAAavwB,EAAKnB,QAAUmB,EAAKuwB,GAAY,IAAM1T,GACtD0T,IAIJ,IAAIC,GAAe,EAEfJ,GAAa,EACbC,GAAY,EAEZI,EAA8BH,EAC9BI,EAAwBH,EAC5B,GAAIrkB,EAAuB,CACvB,KAAOukB,GAA+B,GAA8C,OAAzCzwB,EAAKywB,GAA6B,IACzEA,IAEJ,KAAOC,EAAwB1wB,EAAKnB,QAA6C,OAAnCmB,EAAK0wB,GAAuB,IACtEA,GAER,CAEA,GAAIP,EAAM,CAQN,GAPAxQ,EAAkBwQ,EAAKnwB,KACnBmwB,EAAKE,WACL1Q,EAAgBgR,MAEhB7T,IAASqT,EAAKrT,OACd0T,GAAe,GAEfF,IAAgBH,EAAKG,YAAa,CAClCE,GAAe,EACXL,EAAKC,YACLzQ,EAAgBiR,QAEpB,IAAI1sB,EAAQisB,EAAKG,YACjB,KAAOpsB,GAAS,GAAKyb,EAAgB9gB,QAAU8gB,EAAgB,GAAG,IAAM7C,GAC/D5Q,IAAyBlM,EAAKkE,GAAO,IAAyB,IAAnBlE,EAAKkE,GAAO,IACxDyb,EAAgBkR,QAAQ7wB,EAAKkE,IAEjCA,IAEJ,KAAOA,EAAQlE,EAAKnB,QAAU8gB,EAAgB9gB,QAAU8gB,EAAgB,GAAG,GAAK7C,GAC5E6C,EAAgBiR,QAChB1sB,GAER,CAMA,GAJIgI,IAA0BikB,EAAKjkB,wBAC/ByT,EAAkBA,EAAgBb,QAAO,EAAEuP,EAAIxe,KAAQA,WAGvDygB,IAAgBH,EAAKG,aAAeH,EAAKC,WAAY,CACrDA,GAAa,EAEb,IAAIU,EAAqBR,EAAc,EACvC,GAAIpkB,EACA,KAAO4kB,EAAqB9wB,EAAKnB,QAA0C,OAAhCmB,EAAK8wB,GAAoB,IAChEA,KAI6B,IAAjCL,GAAsC9Q,EAAgB9gB,OACtD8gB,EAAgB,GAAK,CAAC7C,EAAM,MAExBpQ,GAAUiT,EAAgB9gB,OAC1B8gB,EAAgB,GAAK,CAAC7C,EAAM9c,EAAKywB,GAA6B,IAE1D9Q,EAAgB9gB,SAChB8gB,EAAgB,GAAK,CAAC7C,EAAMiU,GAAY/wB,EAAMywB,EAA6BK,EAAoBhU,KAIvG9c,EAAKswB,EAAc,GAAG,KAAO3Q,EAAgB,GAAG,IAAM3f,EAAKswB,EAAc,GAAG,KAAO3Q,EAAgB,GAAG,KACtGyQ,GAAa,EAErB,CACA,IAAIY,EAAeb,EAAKI,WACxB,GAAIJ,EAAKjkB,wBAA0BA,EAAuB,CACtD,IAAI+kB,EAAYX,EAAc,EAC1BY,EAAgB,EAIpB,IAHId,GACAc,IAEGA,GAAiBvR,EAAgB9gB,QAAUoyB,EAAYjxB,EAAKnB,QAAUoyB,EAAYV,GACjFvwB,EAAKixB,GAAW,IAAMpU,GAA+B,OAAvB7c,EAAKixB,GAAW,MAAiBtR,EAAgBuR,IAAkBvR,EAAgBuR,GAAe,KAAOlxB,EAAKixB,GAAW,IAAMtR,EAAgBuR,GAAe,KAAOlxB,EAAKixB,GAAW,MACnNtR,EAAgBjc,OAAOwtB,EAAe,EAAGlxB,EAAKixB,IAC1CA,GAAaD,IACbA,EAAeC,EAAY,IAGnCA,IACAC,GAER,CAEA,IAAIC,EAAYH,GAAgB,EAChC,KAAOG,EAAYnxB,EAAKnB,QAAUmB,EAAKmxB,GAAW,IAAMtU,GAChD7c,EAAKmxB,GAAW,IAAMrU,IACjB5Q,IAAyBlM,EAAKmxB,GAAW,IAA6B,IAAvBnxB,EAAKmxB,GAAW,IAChExR,EAAgB3hB,KAAKgC,EAAKmxB,KAGlCA,IAEJ,KAAOxR,EAAgB9gB,QAAU8gB,EAAgBA,EAAgB9gB,OAAS,GAAG,GAAKge,GAC9E8C,EAAgBgR,KAGxB,MACIhR,EAAkB3f,EAAKklB,MAAMoL,EAAc,EAAGC,GAC1CrkB,IACAyT,EAAkBA,EAAgBb,QAAO,EAAEuP,EAAIxe,KAAQA,WAkB/D,GAdK8P,EAAgB9gB,SAGT8gB,EAFJjT,EACI+jB,EAA8B,EACZ,CAAC,CAAC3T,EAAM,MAAO,CAACD,EAAM,OAEtB,CAAC,CAACC,EAAM9c,EAAKywB,GAA6B,IAAK,CAAC5T,EAAM7c,EAAKywB,GAA6B,KAG5F,CAAC,CAAC3T,EAAMiU,GAAY/wB,EAAMywB,EAA6BC,EAAuB5T,IAAQ,CAACD,EAAMkU,GAAY/wB,EAAMywB,EAA6BC,EAAuB7T,KAEzLuT,GAAa,EACbC,GAAY,IAGXG,EAAc,CACf,IAAIM,EAAqBR,EAAc,EACvC,GAAIpkB,EACA,KAAO4kB,EAAqB9wB,EAAKnB,QAA0C,OAAhCmB,EAAK8wB,GAAoB,IAChEA,IAIJnR,EAAgB9gB,QAAU8gB,EAAgB,GAAG,GAAK7C,IAClDsT,GAAa,GACwB,IAAjCK,EACA9Q,EAAgBkR,QAAQ,CAAC/T,EAAM,OAE3BpQ,EACAiT,EAAgBkR,QAAQ,CAAC/T,EAAM9c,EAAKywB,GAA6B,KAEjE9Q,EAAgBkR,QAAQ,CAAC/T,EAAMiU,GAAY/wB,EAAMywB,EAA6BK,EAAoBhU,KAIlH,CAEA,GAAI6C,EAAgB9gB,QAAU8gB,EAAgBA,EAAgB9gB,OAAS,GAAG,GAAKge,EAAM,CACjFwT,GAAY,EAEZ,IAAIS,EAAqBP,EAAa,EACtC,GAAIrkB,EACA,KAAO4kB,GAAsB,GAAqC,OAAhC9wB,EAAK8wB,GAAoB,IACvDA,IAIJJ,IAA0B1wB,EAAKnB,OAC/B8gB,EAAgB3hB,KAAK,CAAC6e,EAAM,OAExBnQ,EACAiT,EAAgB3hB,KAAK,CAAC6e,EAAM8C,EAAgBA,EAAgB9gB,OAAS,GAAG,KAExE8gB,EAAgB3hB,KAAK,CAAC6e,EAAMkU,GAAY/wB,EAAM8wB,EAAoBJ,EAAuB7T,IAGrG,CAEA,GAA+B,IAA3B8C,EAAgB9gB,OAAc,CAC9B,IAAIuyB,EACAC,EACA3kB,GAEI0kB,EADAX,EAA8B,EACnB,CAAC3T,EAAM,MAEP,CAACA,EAAM9c,EAAKywB,GAA6B,IAExDY,EAAW,CAACxU,EAAM8C,EAAgB,GAAG,MAErCyR,EAAW,CAACtU,EAAMiU,GAAY/wB,EAAMywB,EAA6BH,EAAc,EAAGxT,IAClFuU,EAAW,CAACxU,EAAMkU,GAAY/wB,EAAMuwB,EAAa,EAAGG,EAAuB7T,KAE/E8C,EAAgBkR,QAAQO,GACxBzR,EAAgB3hB,KAAKqzB,GACrBjB,GAAa,EACbC,GAAY,CAChB,CAEA,MAAO,CACHrwB,KAAM2f,EACN7C,OACAD,OACAyT,cACAC,aACAH,aACAC,YACAnkB,wBAGR,CAmBA,SAAS6kB,GAAY/wB,EAAMsxB,EAAYC,EAAaC,GAChD,GAAIF,EAAa,GAAKC,EAAc,EAChC,OAAO,KAGX,GAAID,GAActxB,EAAKnB,QAAU0yB,GAAevxB,EAAKnB,OACjD,OAAO,KAGX,GAAIyyB,IAAeC,EACf,OAAOvxB,EAAKsxB,GAAY,GAG5B,MAAOG,EAASC,GAAW1xB,EAAKsxB,IACzBK,EAAQC,GAAU5xB,EAAKuxB,GAE9B,GAAIC,IAAaC,GAAuB,OAAZC,EACxB,OAAOA,EAGX,GAAIF,IAAaG,GAAqB,OAAXC,EACvB,OAAOA,EAGX,GAAgB,OAAZF,GAA+B,OAAXE,EACpB,OAAO,KAGX,MAAMC,GAAWL,EAAWC,IAAUE,EAASF,GAC/C,OAAII,EAAU,GAAKA,EAAU,EAClB,KAGJA,GAASD,EAASF,GAAWA,CACxC,CC/Te,SAASI,IAAY,KAAEje,EAAI,KAAEC,EAAI,MAAE9F,IAe9C,MAdc,QAAVA,IACA8F,EAAO4F,KAAK+J,MAAM3P,GAIVD,EAFJA,GAAQ,EACJC,EAAO,GACCA,EAED,EAAEA,EAGN4F,KAAK+J,MAAM5P,IAInB,CACHA,OACAC,OAER,CC0Ee,SAASie,IAA2B,KAAE/xB,EAAI,KAAEmwB,EAAI,YAAEhe,EAAW,aAAEC,EAAY,KAAE0K,EAAI,KAAED,EAAI,KAAEhJ,EAAI,KAAEC,EAAI,MAAE9F,EAAK,YAAEgkB,IACnH7B,GAAQA,EAAKvc,QAAQ/U,SAAWsT,IAChCge,EAAO,MAGX,MAAM1c,EAAY0c,GAAQA,EAAK1c,UAAa,IAAIwe,WAAW9f,GAC3DsB,EAAS8N,KAAK,GACd,MAAM3N,EAAU,IAAIse,aAAa/f,GAC3BwB,EAAa,IAAIue,aAAa/f,GAC9BuB,EAAa,IAAIwe,aAAa/f,GAE9BggB,EAAeL,GAAY,CAAEje,OAAMC,OAAM9F,UAIzCokB,EAAW,CAAEpyB,OAAMmS,cAAaC,eAAc0K,OAAMD,OAAMhJ,KAHhEA,EAAOse,EAAate,KAGkDC,KAFtEA,EAAOqe,EAAare,KAEwD9F,SAE5E,IAAIqkB,EAASC,EAEb,GAAIle,IAAW,CACX,IAAIme,EAAiB,EAErB,MAAMC,EAAUrC,GAAQA,EAAKmC,cAAgBnC,EAAKkC,QAC5CI,GAAWT,GAAeQ,GAAWrC,EAAKrT,OAASA,GAAQqT,EAAKtT,MAAQA,GAAQsT,EAAKtxB,QAAUmB,EAAKnB,OAE1G,IAAK4zB,GAAWtC,EAAKmC,aAAazzB,OAASmB,EAAKnB,OAAQ,CACpD,MAAM6zB,EAAmB,KACzBL,EAAU,IAAIH,aAAaxY,KAAKoV,MAAkB,EAAZ9uB,EAAKnB,OAAS6zB,IACpDJ,EAAe,IAAIL,WAAWvY,KAAKoV,MAAM9uB,EAAKnB,OAAO6zB,IAEjDD,IACAH,EAAavd,IAAIob,EAAKmC,cACtBD,EAAQtd,IAAIob,EAAKkC,SAEzB,MACIA,EAAUlC,EAAKkC,QACfC,EAAenC,EAAKmC,aAGpBG,IACAF,EAAiB7Y,KAAKC,IAAIwW,EAAKtxB,OAAS,EAAG,IAG/C,IAAK,IAAIE,EAAIwzB,EAAgBxzB,EAAIiB,EAAKnB,OAAQE,IAC1CszB,EAAQ,EAAEtzB,GAAKiB,EAAKjB,GAAG,GACvBszB,EAAQ,EAAEtzB,EAAI,GAAKiB,EAAKjB,GAAG,GAER,OAAfiB,EAAKjB,GAAG,GACRuzB,EAAavzB,GAAK,EAElBuzB,EAAavzB,GAAK,EAG1BqV,IAAUue,+BAA+B3yB,EAAKnB,OAAQwzB,EAASC,EAAcF,EAAU3e,EAAUG,EAASD,EAAYD,EAC1H,MAvJJ,UAA2C,KAAE1T,EAAI,YAAEmS,EAAW,aAAEC,EAAY,KAAE0K,EAAI,KAAED,EAAI,KAAEhJ,EAAI,KAAEC,EAAI,MAAE9F,IAAS,SAAEyF,EAAQ,QAAEG,EAAO,WAAED,EAAU,WAAED,IAC5I,IAAI3U,EAAI,EACJ6zB,EAAQ7zB,EAAI,EAEhB,IAAK,IAAIijB,EAAS,EAAGA,EAAS7P,EAAa6P,IAAU,CAEjD,MAAM1S,EAAK0S,GAAQ7P,EAAc,IAAK0K,EAAOC,GAAQA,EAGrD,IAAI+V,EAAW,KACXC,EAAW,KAUf,IARI/zB,EAAI,GAAKA,GAAKiB,EAAKnB,QAA6B,OAAnBmB,EAAKjB,EAAI,GAAG,IACzCA,IAGAA,EAAIiB,EAAKnB,OAAS,GAAKmB,EAAKjB,EAAI,GAAG,GAAKuQ,GACxCvQ,IAGIA,EAAIiB,EAAKnB,OAAS,GAAKmB,EAAKjB,EAAI,GAAG,GAAKuQ,EAAGvQ,IAAK,CACpD,MAAMg0B,EAAO/yB,EAAKjB,GAAG,GAER,OAATg0B,KAIa,OAAbF,GAAqBE,EAAOF,KAC5BA,EAAWE,IAGE,OAAbD,GAAqBC,EAAOD,KAC5BA,EAAWC,GAEnB,CAMA,GAJApf,EAAWqO,GAAuB,OAAb6Q,EAAoB,EAAIzgB,GAAc,IAAgB,QAAVpE,EAAkB0L,KAAK+J,MAAMoP,GAAYA,GAAYhf,IAAOC,EAAOD,IACpIH,EAAWsO,GAAuB,OAAb8Q,EAAoB,EAAI1gB,GAAc,IAAgB,QAAVpE,EAAkB0L,KAAK+J,MAAMqP,GAAYA,GAAYjf,IAAOC,EAAOD,IAGhI9U,GAAKiB,EAAKnB,OAAS,GAAoB,OAAfmB,EAAKjB,GAAG,IAAkC,OAAnBiB,EAAKjB,EAAI,GAAG,GAAa,CACxE,MAAM8Q,EAAI9Q,GAAKiB,EAAKnB,OAAS,EAAI,KAAOmB,EAAKjB,GAAG,GAEhD0U,EAASuO,GAAkB,OAANnS,GAAmC,OAAbgjB,IAAsB,GAAoB,OAAbC,IAAsB,EAC9Flf,EAAQoO,GAAgB,OAANnS,EAAa,EAAIuC,GAAc,IAAgB,QAAVpE,EAAkB0L,KAAK+J,MAAM5T,GAAKA,GAAKgE,IAAOC,EAAOD,IAE5G9U,IAEA,QACJ,CAGA,MAAO0yB,EAASC,GAAW1xB,EAAKjB,IACzB4yB,EAAQC,GAAU5xB,EAAKjB,EAAI,GAGlC,IAAI8Q,GADaP,EAAImiB,IAAYE,EAASF,IACvBG,EAASF,GAAWA,EAGnCkB,IAAU7zB,IACV8Q,EAAI6hB,GAeR9d,EAAQoO,GAAgB,OAANnS,EAAa,EAAIuC,GAAc,IAAgB,QAAVpE,EAAkB0L,KAAK+J,MAAM5T,GAAKA,GAAKgE,IAAOC,EAAOD,IAC5GJ,EAASuO,GAAkB,OAANnS,GAAmC,OAAbgjB,IAAsB,GAAoB,OAAbC,IAAsB,EAE9FF,EAAQ7zB,CACZ,CACJ,CAwEQi0B,CAAkCZ,EAAU,CAAE3e,WAAUG,UAASD,aAAYD,eAGjF,MAAO,CACHD,WACAG,UACAD,aACAD,aACA2e,UACAC,eACAxV,OACAD,OACAhe,OAAQmB,EAAKnB,OAErB,CCjKe,SAASo0B,GAAkB7V,GAAY,OAACtP,EAAM,YAAE8R,IAC3D,MAAMsT,EAAY,GAClB,IAAIC,EAAK,EAET,IAAK,IAAI7F,KAASlQ,EAAY,CAC1B,MAAMyP,EAASuG,GAAc9F,EAAOxf,GAEpC,GAAIA,EAAOjC,MAAQwR,MAAMC,QAAQuP,GAAS,CACtC,IAAK,IAAIiB,KAAYR,EAAMxf,EAAOjC,MAAO,CACrC,GAAIiC,EAAO5B,uBAA0D,iBAA1B4hB,EAAShgB,EAAOjC,QAAuBwR,MAAMC,QAAQwQ,GAC5F,SAGJ,MAAMxe,EAAIsQ,EAAYuT,KAAM,GAExBrlB,EAAOpB,QAAUwmB,EAAUr0B,OAAS,GACpCq0B,EAAUl1B,KAAK,CAACsR,EAAG4jB,EAAUA,EAAUr0B,OAAS,GAAG,KAGvDq0B,EAAUl1B,KAAK,CAACsR,EAAGwe,GACvB,CAEA,QACJ,CAEA,GAAIhgB,EAAO5B,uBAAyB,MAAC2gB,EACjC,SAGJ,MAAMvd,EAAIsQ,EAAYuT,KAAM,GAExBrlB,EAAOpB,QAAUwmB,EAAUr0B,OAAS,GACpCq0B,EAAUl1B,KAAK,CAACsR,EAAG4jB,EAAUA,EAAUr0B,OAAS,GAAG,KAGvDq0B,EAAUl1B,KAAK,CAACsR,EAAGge,GACvB,CAMA,OAJI4F,EAAUr0B,SAAW+gB,EAAY/gB,QACjCmX,QAAQqd,KAAK,kEAGVH,CACX,CAEO,SAASE,GAAc9F,EAAOxf,GACjC,OAAIA,EAAOjC,KACAyhB,EAAMxf,EAAOjC,MAGpBwR,MAAMC,QAAQgQ,GACO,IAAjBA,EAAMzuB,OACCyuB,EAAM,GAENA,EAAM,GAIdA,CACX,CAEO,SAASgG,GAAchG,EAAOxf,GACjC,OAAIA,EAAOlC,KACA0hB,EAAMxf,EAAOlC,MAGpByR,MAAMC,QAAQgQ,GACPA,EAAM,GAGVA,CACX,CCuHO,SAASiG,IAAY,OAAE3I,EAAM,OAAEC,EAAM,OAAE9O,GAAUkN,GACpD,MAAM,EAAE3Z,EAAC,EAAEO,GAAMoZ,EAEXjb,EAAQib,EAAQnb,OAAOvB,KAAKyB,MAC5B0O,EAASuM,EAAQnb,OAAOvB,KAAKmT,eAC7B,KAAE7L,EAAI,KAAEC,GAASge,GAAY,IAAIpV,EAAQ1O,UAEzCgU,GAAU1S,EAAIoN,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAAQf,EAAO9J,aAChEiX,GAAU,IAAgB,QAAVlb,EAAkB0L,KAAK+J,MAAM5T,GAAKA,GAAKgE,IAAOC,EAAOD,IAASkI,EAAO7J,cAErFshB,EAAW9Z,KAAK+Z,MAAMzR,EAAS4I,IAAS,GAAK1B,EAAS2B,IAAS,GAC/D6I,EAAYha,KAAKgK,IAAI1B,EAAS4I,GAEpC1jB,OAAOsoB,OAAOvG,EAAS,CACnB0K,WAAY5X,EAAO9J,aACnB+P,OAAQA,EACRkH,OAAQrF,MAAMqF,GAAUnN,EAAO7J,cAAc,EAAIgX,EACjDwK,YACAF,YAER,CV9JA1I,GAAYpC,UAAY,CACpBwC,YAAa3oB,IAAAA,MAAgB,CACzB+M,EAAG/M,IAAAA,OACHsN,EAAGtN,IAAAA,OACH4oB,QAAS5oB,IAAAA,KACTuH,MAAOvH,IAAAA,UAAoB,CACvBA,IAAAA,WAAqBgN,MACrBhN,IAAAA,OACAA,IAAAA,WAELtB,YWvEP,MAwCA,GAxC0B,CACtBwG,IAAKA,OACLmsB,WAAarU,IACT,GAAKA,EAAaqG,MAIlB,MAAO,CACH9I,KAAMpD,KAAKC,IAAI,IAAIpK,KAAKgQ,EAAa1C,MAAM6I,UAAY,IAASnG,EAAazC,MAChF,EAEL+W,cAAgBtU,IACZ,GAAKA,EAAaqG,MAIlB,MAAO,CACH9I,KAAMpD,KAAKC,IAAI,IAAIpK,KAAKgQ,EAAa1C,MAAM6I,UAAY,IAAYnG,EAAazC,MACnF,EAELgX,SAAWvU,IACP,GAAKA,EAAaqG,MAIlB,MAAO,CACH9I,KAAMpD,KAAKC,IAAI,IAAIpK,KAAKgQ,EAAa1C,MAAM6I,UAAY,KAAYnG,EAAazC,MACnF,EAELiX,QAAUxU,IACN,GAAKA,EAAaqG,MAIlB,MAAO,CACH9I,KAAMpD,KAAKC,IAAI,IAAIpK,KAAKgQ,EAAa1C,MAAM6I,UAAY,MAAenG,EAAazC,MACtF,GCpBM,SAASkX,IAAkB,KAAEh0B,EAAI,KAAEmwB,EAAI,KAAErT,EAAI,KAAED,EAAI,YAAE1K,EAAW,YAAE6f,IAC7E,MAAMiC,EAjBgB,EAiBI9hB,EAI1B,IAAI+hB,EAgBJ,IAlBiBlC,GAAe7B,GAAQA,EAAKrT,OAASA,GAAQqT,EAAKtT,MAAQA,GAAQsT,EAAKtxB,QAAUmB,EAAKnB,QAInGq1B,EAAyB/D,EAAKnwB,KAE1BA,EAAKnB,OAASsxB,EAAKtxB,SAEfmB,EAAKnB,OAAS,GAAKq1B,EAAuBr1B,OAAS,IACnDq1B,EAAuBA,EAAuBr1B,OAAS,GAAKmB,EAAKmwB,EAAKtxB,OAAS,IAGnFq1B,EAAyBA,EAAuBt1B,OAAOoB,EAAKklB,MAAMiL,EAAKtxB,WAG3Eq1B,EAAyB,IAAIl0B,GAG7Bk0B,EAAuBr1B,OAASo1B,EAAoBE,EACpD,MAAO,CACHn0B,KAAMk0B,EACNpX,OACAD,OACAhe,OAAQmB,EAAKnB,QAIrB,MAAMu1B,EAAgB,GAChBC,GAAcxX,EAAOC,GAAMmX,EACjC,IAAIK,EAAc,KACdC,EAAc,KACdC,EAAqB,EAGrBx0B,EAAKnB,QACLu1B,EAAcp2B,KAAKgC,EAAK,IAG5B,IAAK,IAAImgB,KAAS+T,EAAwB,CACtC,MAAO5kB,EAAGO,GAAKsQ,EAEf,GAAU,OAANtQ,EACA,SAGJ,MAAM4kB,EAAc/a,KAAKoV,OAAOxf,EAAIwN,GAAMuX,GAEtCI,IAAgBD,IACZF,GAAeC,IACXD,IAAgBC,EACZH,EAAcA,EAAcv1B,OAAS,KAAOy1B,GAC5CF,EAAcp2B,KAAKs2B,GAEhBA,EAAY,GAAKC,EAAY,GACpCH,EAAcp2B,KAAKu2B,EAAaD,GAEhCF,EAAcp2B,KAAKs2B,EAAaC,IAIxCD,EAAc,KACdC,EAAc,KACdC,EAAqBC,KAGpBH,GAAezkB,EAAIykB,EAAY,MAChCA,EAAcnU,KAGboU,GAAe1kB,EAAI0kB,EAAY,MAChCA,EAAcpU,EAEtB,CAiBA,OAfImU,GAAeC,IACXD,IAAgBC,EAChBH,EAAcp2B,KAAKs2B,GACZA,EAAY,GAAKC,EAAY,GACpCH,EAAcp2B,KAAKu2B,EAAaD,GAEhCF,EAAcp2B,KAAKs2B,EAAaC,IAKpCv0B,EAAKnB,QAAU,GAAKmB,EAAKA,EAAKnB,OAAS,KAAOy1B,GAAet0B,EAAKA,EAAKnB,OAAS,KAAO01B,GACvFH,EAAcp2B,KAAKgC,EAAKA,EAAKnB,OAAS,IAGnC,CACHmB,KAAMo0B,EACNtX,OACAD,OACAhe,OAAQmB,EAAKnB,OAErB,CC3Ge,SAAS61B,GAActV,EAAclb,GAChD,IAAInD,EAAOqe,EAAare,MAAQqe,EAAavT,KAM7C,OAJK9K,IACDA,EAAOmD,EAAM5F,YAGVyC,CACX,CCfO,SAAS4zB,IAA+B,KAAE30B,EAAI,WAAE6M,EAAU,KAAEiQ,EAAI,KAAED,IACrE,IAAKhQ,EACD,OAAO,KAGX,MAAM+nB,EAAa,GACnB,IAAK,IAAK5tB,EAAK+E,KAAU7E,OAAO8b,QAAQnW,GAAa,CACjD,GAAqB,iBAAVd,EAAoB,CAC3B,GAA+B,mBAApBA,EAAM8oB,UACb,MAAM,IAAI/zB,MAAM,mCAAqCkG,EAAM,mCAG/D4tB,EAAW52B,KAAKkJ,OAAOsoB,OAAO,CAC1BxoB,MACA8tB,WAAY,SACZC,gBAAiB,MAClBhpB,IACH,QACJ,CAEA,GAAY,SAAR/E,EAAgB,CAChB4tB,EAAW52B,KAAK,CACZ62B,UAAYhlB,GAAY,OAANA,GAAc9D,EAChCA,QACA/E,MACA8tB,WAAY,IACZC,gBAAiB,OAErB,QACJ,CAEA,MAAOD,EAAYhrB,GAAS9C,EAAI4L,MAAM,KACtC,IAAKkiB,IAAehrB,GAAS+Z,MAAM/Q,WAAWhJ,IAC1C,MAAM,IAAIhJ,MAAM,mCAAqCkG,GAGzD,MAAMguB,EAAcliB,WAAWhJ,GAE/B,IAAI+qB,EACJ,GAAmB,MAAfC,EACAD,EAAahlB,GAAmB,iBAANA,GAAkBA,IAAMmlB,GAAejpB,OAC9D,GAAmB,MAAf+oB,EACPD,EAAahlB,GAAmB,iBAANA,GAAkBA,EAAImlB,GAAejpB,OAC5D,GAAmB,MAAf+oB,EACPD,EAAahlB,GAAmB,iBAANA,GAAkBA,EAAImlB,GAAejpB,OAC5D,GAAmB,OAAf+oB,EACPD,EAAahlB,GAAmB,iBAANA,GAAkBA,GAAKmlB,GAAejpB,MAC7D,IAAmB,OAAf+oB,EAGP,MAAM,IAAIh0B,MAAM,mCAAqCkG,GAFrD6tB,EAAahlB,GAAmB,iBAANA,GAAkBA,GAAKmlB,GAAejpB,CAGpE,CAEA6oB,EAAW52B,KAAK,CACZ62B,YACA9oB,QACA/E,MACA8tB,aACAC,gBAAiBC,GAEzB,CAEA,MAAMxS,EAAoB,GAC1B,IAAIyS,EAAiB,KAErB,IAAK,IAAIl2B,EAAI,EAAGA,EAAIiB,EAAKnB,OAAQE,IAAK,CAClC,IAAKuQ,EAAGO,GAAK7P,EAAKjB,GACduQ,aAAaC,OACbD,EAAIA,EAAEoW,WAGV,IAAK,IAAIwP,KAAaD,EAAiB,CAACA,EAAeC,aAAcN,GAAcA,EAAY,CAC3F,MAAM7oB,EAAQmpB,EAAUL,UAAUhlB,GAElC,GAAIolB,EAAgB,CAChB,GAAIA,EAAelpB,QAAUA,EACzB,MAGJ,IAAIopB,EAAmB7lB,EACvB,GAAIvQ,EAAI,EAAG,CACP,IAAKqW,EAAOrB,GAAS/T,EAAKjB,EAAI,GAC1BqW,aAAiB7F,OACjB6F,EAAQA,EAAMsQ,WAIdyP,EAD6C,OAA7CF,EAAeC,UAAUH,gBACNzlB,EACN,OAANO,EACYuF,EAEAA,GAAS8f,EAAUH,gBAAkBhhB,IAAQlE,EAAIkE,IAAQzE,EAAI8F,EAExF,CAEAoN,EAAkBxkB,KAAK,IAChBi3B,EACHpY,KAAMsY,EACN5Z,OAAQ4Z,EAAmBrY,IAAOD,EAAOC,KAE7CmY,EAAiB,IACrB,CAEA,GAAIlpB,EAAO,CACP,IAAIqpB,EAAmB9lB,EACvB,GAAIvQ,EAAI,EAAG,CACP,IAAKqW,EAAOrB,GAAS/T,EAAKjB,EAAI,GAC1BqW,aAAiB7F,OACjB6F,EAAQA,EAAMsQ,WAId0P,EAD8B,OAA9BF,EAAUH,gBACS3f,EACF,OAAVrB,EACYzE,EAEA8F,GAAS8f,EAAUH,gBAAkBhhB,IAAQlE,EAAIkE,IAAQzE,EAAI8F,EAExF,CAEA6f,EAAiB,CACbnY,KAAMsY,EACN9Z,OAAQ8Z,EAAmBtY,IAAOD,EAAOC,GACzC/Q,QACAmpB,aAGJ,KACJ,CACJ,CACJ,CAUA,OARID,GACAzS,EAAkBxkB,KAAK,IAChBi3B,EACHpY,KAAM7c,EAAKA,EAAKnB,OAAS,GAAG,GAC5B0c,OAAQvb,EAAKA,EAAKnB,OAAS,GAAG,GAAKie,IAAOD,EAAOC,KAIlD,CACH9c,KAAMwiB,EAEd,CCzHe,MAAM6S,WAAwB/a,EAEzCzD,WAAAA,EAAY,wBAAEye,EAAuB,sBAAEC,EAAqB,YAAEC,EAAW,4BAAEC,EAA2B,mBAAEC,EAAkB,uBAAEC,EAAsB,mBAAEC,EAAkB,SAAEC,EAAQ,UAAEC,EAAS,gBAAEC,EAAe,oBAAEC,EAAmB,WAAEC,IAC/NpY,QAEAtf,KAAK23B,aAAeV,EAChBA,GACAvhB,EAAeC,MAAK,KAChB3V,KAAK43B,YAAY,IAIzB53B,KAAK63B,QAAU,GACf73B,KAAK83B,0BAA4B,IAAIC,IAErC/3B,KAAKg4B,MAAQ,CACT,CACIzoB,OAAQ,GACRE,MAAO,SACPD,KAAM,OACNF,UAAW,IAGnBtP,KAAKi4B,mBAAqB,KAE1Bj4B,KAAKk4B,sBAAwBhB,IAA+B,EAC5Dl3B,KAAKm4B,aAAc,EACnBn4B,KAAKo4B,YAAc,IACnBp4B,KAAKq4B,qBAAuB,EAC5Br4B,KAAKs4B,gBAAkBjB,EACvBr3B,KAAKu4B,eAAgB,EACrBv4B,KAAKw4B,gBAAkBrB,IAAsB,EAC7Cn3B,KAAKy4B,oBAAsBrB,IAA0B,EACrDp3B,KAAK04B,WAAanB,EAClBv3B,KAAK24B,YAAcjB,IAAc,EAEjC13B,KAAK44B,kBAAoB,IAAIxc,IAC7Bpc,KAAK64B,cAAgB,CACjBC,cAAc,EACdzM,OAAQ,EACRC,OAAQ,EACR5Y,aAAc,EACdC,cAAe,EACf8W,SAAU,IAEdzqB,KAAK+4B,qBAAuB,CACxBhoB,EAAG,EACHO,EAAG,EACHsb,SAAS,EACTrhB,MAAO,MAEXvL,KAAKg5B,eAAiB,GACtBh5B,KAAKi5B,YAAa,EAClBj5B,KAAKk5B,aAAe,GACpBl5B,KAAKm5B,kBAAoB,CACrBzlB,aAAc,EACd0lB,YAAa,IAEjBp5B,KAAKq5B,SAAW,CAAC,EACjBr5B,KAAKs5B,WAAY,EAEjBt5B,KAAKu5B,cAAgB,GACrBv5B,KAAKw5B,aAAe,EACpBx5B,KAAKy5B,kBAAoB,EAEzBz5B,KAAK05B,gBAAkB,IAAItd,IAC3Bpc,KAAK25B,mBAAqB,CAAC,EAC3B35B,KAAK45B,2BAA6B,CAAC,EACnC55B,KAAK65B,gBAAkB,KACvB75B,KAAK85B,mBAAqB,KAE1B95B,KAAK+5B,kBC3FE,SAAoCC,EAAYC,GAC3D,GAAIC,GAAkBF,GAClB,OAAOE,GAAkBF,GAG7B,IAAK,IAAI,MAAEtqB,EAAK,WAAEG,KAAgBoqB,EAC9B,GAAID,IAAetqB,EACf,OAAOG,EAIf,OAAOqqB,GAAkBhxB,GAC7B,CD+EiCixB,CAA2BpD,EAAyBC,GAC7Eh3B,KAAKo6B,eAAiB,CAACp6B,KAAK+5B,mBAC5B/5B,KAAKq6B,aAAe,EAEpBr6B,KAAKs6B,WAAa9C,GAAmB,IAAIO,IACzC/3B,KAAKu6B,eAAiB9C,GAAuB,IAAIM,IACjD/3B,KAAKw6B,uBAAyB/C,EAC9Bz3B,KAAKy6B,qBAAuB,IAAI1C,IAChC/3B,KAAK06B,YAAc,IAAIte,IACvBpc,KAAK26B,oBAAsB,IAAI5C,IAC/B/3B,KAAK46B,mBAAqB,IAAI7C,IAC9B/3B,KAAK66B,2BAA6B,IAAIze,IAEtCpc,KAAK86B,UAAYxD,EACbt3B,KAAK86B,WACL96B,KAAK86B,UAAUze,IAAIrc,MAGvBA,KAAK+6B,eACT,CAEA1hB,OAAAA,GAKI,GAJArZ,KAAKyc,KAAK,UAAWzc,MAErBA,KAAKic,kBAEAjc,KAAKw6B,qBAAsB,CAC5B,IAAK,IAAIQ,KAAYh7B,KAAKu6B,eAAevM,SACrCgN,EAASC,cAEbj7B,KAAKu6B,eAAejhB,OACxB,CAEA,IAAK,IAAIuH,KAAgB7gB,KAAK63B,QAC1B73B,KAAKk7B,cAAcra,GAGnB7gB,KAAK86B,WACL96B,KAAK86B,UAAUt1B,OAAOxF,MAG1BA,KAAKm7B,UAAW,CACpB,CAEAC,SAAAA,CAAU7rB,GACN,MAAM8rB,EAAar7B,KAAK63B,QAAQtX,QAAQM,GAAiBA,EAAaya,cAChEC,EAAcv7B,KAAK63B,QAAQtX,QAAQM,IAAkBA,EAAaya,cAExE,GAAI/rB,EAAOjP,SAAWi7B,EAAYj7B,OAAQ,CACtC,IAAIk7B,GAAe,EACnB,IAAK,IAAIh7B,EAAI,EAAGA,EAAI+O,EAAOjP,OAAQE,IAC/B,GAAI+O,EAAO/O,KAAOR,KAAK63B,QAAQr3B,GAAGi7B,eAAgB,CAC9CD,GAAe,EACf,KACJ,CAGJ,IAAKA,EACD,MAER,MACIx7B,KAAK07B,YAAc17B,KAAK07B,aAAe17B,KAAK24B,YAGhD,MAAMgD,EAAe,IAAIvf,IAAI7M,GAC7B,IAAK,IAAIsR,KAAgB0a,EAChBI,EAAaC,IAAI/a,EAAa4a,iBAC/Bz7B,KAAKk7B,cAAcra,GAI3B7gB,KAAK63B,QAAQ1yB,OAAO,GACpB,IAAK,IAAI3E,EAAI,EAAGA,EAAI+O,EAAOjP,OAAQE,IAAK,CACpC,MAAMi7B,EAAiBlsB,EAAO/O,GAE9B,IAAIqgB,EAAe7gB,KAAK83B,0BAA0BhvB,IAAI2yB,GACjD5a,IACDA,EAAe,IACR4a,EACHA,kBAEJz7B,KAAK83B,0BAA0BthB,IAAIilB,EAAgB5a,GAE/CA,EAAa3S,0BACblO,KAAK44B,kBAAkBvc,IAAIwE,GAC3B7gB,KAAK67B,kBAAmB,EACxB77B,KAAK87B,aAAa,4BAA6B97B,KAAK44B,qBAI5D/X,EAAalb,MAAQnF,EACrBR,KAAK63B,QAAQp4B,KAAKohB,GAClB7gB,KAAK+7B,cAAclb,GAEfA,EAAamb,QACbh8B,KAAKi8B,YAAYpb,EAEzB,CAEA,IAAK,IAAIrgB,EAAI,EAAGA,EAAI66B,EAAW/6B,OAAQE,IAAK,CACxC,MAAMqgB,EAAewa,EAAW76B,GAChCqgB,EAAalb,MAAQnF,EAAI+O,EAAOjP,OAChCN,KAAK63B,QAAQp4B,KAAKohB,EACtB,CAEA7gB,KAAK87B,aAAa,iBAAkB97B,KAAK63B,SAEzC73B,KAAKk8B,cAAe,EACpBl8B,KAAK43B,YACT,CAEAA,UAAAA,GACI,GAAI53B,KAAKm8B,gBACL,OAGJ,GAAIn8B,KAAK23B,eAAiB9hB,EACtB,OAGJ,MAAMumB,EAAoBC,YAAYC,MACtCt8B,KAAKm8B,iBAAkB,EACvBnpB,uBAAsB,KAClB,GAAIhT,KAAKm7B,SACL,OAGJ,MAAMoB,EAAsBF,YAAYC,MAElCE,EAAsBH,YAAYC,MACpCt8B,KAAKk8B,cACLl8B,KAAK+6B,gBACL/6B,KAAKy8B,eAAgB,EACrBz8B,KAAK67B,kBAAmB,EACxB77B,KAAK08B,qBAAsB,GACpB18B,KAAK05B,gBAAgBld,MAC5Bxc,KAAK28B,WAAW38B,KAAK05B,iBACrB15B,KAAKy8B,eAAgB,EACrBz8B,KAAK67B,kBAAmB,EACxB77B,KAAK08B,qBAAsB,IAEvB18B,KAAK48B,sBACL58B,KAAK68B,kCACL78B,KAAKy8B,eAAgB,GAErBz8B,KAAK88B,yBACL98B,KAAK+8B,qCACL/8B,KAAKy8B,eAAgB,IAG7B,MAAMO,EAAoBX,YAAYC,MAEhCW,EAAsBZ,YAAYC,MACpCt8B,KAAKy8B,eACLz8B,KAAKk9B,UAET,MAAMC,EAAoBd,YAAYC,MAEhCc,EAAkBf,YAAYC,MAChCt8B,KAAKq9B,qBACLr9B,KAAKs9B,kBAET,MAAMC,EAAgBlB,YAAYC,MAE5BkB,EAAenB,YAAYC,MAC7Bt8B,KAAK67B,kBACL77B,KAAKy9B,uBAET,MAAMC,EAAarB,YAAYC,MAEzBqB,EAAmBtB,YAAYC,MACjCt8B,KAAK49B,qBACL59B,KAAK69B,0BAET,MAAMC,EAAiBzB,YAAYC,MAE7ByB,EAAkB1B,YAAYC,MAChCt8B,KAAK08B,qBACL18B,KAAKg+B,0BAET,MAAMC,EAAgB5B,YAAYC,MAE9Bt8B,KAAK07B,cACL17B,KAAK65B,gBAAgB/U,kBACrB9kB,KAAK85B,oBAAsB95B,KAAK85B,mBAAmBhV,mBAGvD9kB,KAAKm8B,iBAAkB,EACvBn8B,KAAKy8B,eAAgB,EACrBz8B,KAAKk8B,cAAe,EACpBl8B,KAAK48B,qBAAsB,EAC3B58B,KAAK88B,wBAAyB,EAC9B98B,KAAK05B,gBAAgBpgB,QACrBtZ,KAAK66B,2BAA2BvhB,QAChCtZ,KAAK67B,kBAAmB,EACxB77B,KAAK49B,qBAAsB,EAC3B59B,KAAK08B,qBAAsB,EAC3B18B,KAAKq9B,qBAAsB,EAC3Br9B,KAAK07B,aAAc,EAEnB,MAAMwC,EAAiB7B,YAAYC,MACnC,IAAK,IAAI6B,IAAY,IAAIx1B,OAAOqlB,OAAOhuB,KAAK45B,+BAAgCjxB,OAAOqlB,OAAOhuB,KAAK25B,qBAC3F35B,KAAKyc,QAAQ0hB,GAEjB,MAAMC,EAAe/B,YAAYC,MACjCt8B,KAAK25B,mBAAqB,CAAC,EAC3B35B,KAAK45B,2BAA6B,CAAC,EAEnC,MAAMyE,EAAiBhC,YAAYC,MAC7BgC,EAAW,CACbC,eAAgBF,EAAiB9B,EACjCiC,yBAA0BH,EAAiBjC,EAC3CqC,WAAYlB,EAAgBH,EAC5BsB,eAAgB1B,EAAoBR,EACpCmC,eAAgBxB,EAAoBF,EACpCxS,SAAUiT,EAAaF,EACvB7Q,YAAamR,EAAiBH,EAC9BvE,YAAa6E,EAAgBF,EAC7Ba,UAAWR,EAAeF,GAE9Bl+B,KAAK6+B,aAAeP,EAChBt+B,KAAKy5B,oBACDz5B,KAAKu5B,cAAcj5B,OAASN,KAAKy5B,kBACjCz5B,KAAKu5B,cAAc95B,KAAK6+B,GAExBt+B,KAAKu5B,cAAcv5B,KAAKw5B,aAAex5B,KAAKy5B,mBAAqB6E,EAErEt+B,KAAKw5B,gBAETx5B,KAAKyc,KAAK,cAAe4hB,EAAiB9B,EAAqB+B,EAAS,GAEhF,CAEAxC,YAAAA,IAAgBpf,GACZ1c,KAAK25B,mBAAmBjd,EAAK,IAAMA,CACvC,CAEAoiB,oBAAAA,IAAwBpiB,GACpB1c,KAAK45B,2BAA2Bld,EAAK,IAAMA,CAC/C,CAEAqiB,mBAAAA,CAAoBle,GAChB,MAAM1V,EAAOwT,EAAUkC,GACvB,GAAI5T,EAAkB0Y,SAASxa,GAC3B,OAAO0V,EAAapf,KAIxB,IAAIu9B,EAAch/B,KAAKs6B,WAAWxxB,IAAI+X,EAAapf,MAEnD,GAAIu9B,GAAeh/B,KAAK66B,2BAA2Be,IAAI/a,EAAapf,MAChE,OAAOu9B,EASX,GANKA,IACDA,EAAc,GACdh/B,KAAKs6B,WAAW9jB,IAAIqK,EAAapf,KAAMu9B,GACvCne,EAAahC,WAAamgB,GAGjB,sBAAT7zB,GAAyC,qBAATA,EAA6B,CAC7D,IAAI8zB,EAAcj/B,KAAKy6B,qBAAqB3xB,IAAI+X,EAAapf,MAC7D,GAAIw9B,EAAa,CACb,MAAMC,EAAsBD,EAAYjR,SAASmR,OAAO5zB,MAExD,GADAyzB,EAAcE,EAAoBrgB,YAC7BmgB,EACD,MAAM,IAAIz8B,MAAO,6BAA4B28B,EAAoB18B,MAAQ08B,EAAoB5xB,MAAQ4xB,EAAoBz9B,QAE7HzB,KAAKs6B,WAAW9jB,IAAIqK,EAAapf,KAAMu9B,GACvCne,EAAahC,WAAamgB,CAC9B,MACIC,EAAc,IAAI7iB,IAClByE,EAAahC,WAAamgB,EAC1Bh/B,KAAKy6B,qBAAqBjkB,IAAIqK,EAAapf,KAAMw9B,GAGrDA,EAAY5iB,IAAIwE,GAEhB7gB,KAAKo/B,wBAAwB,CACzBC,WAAYxe,EAAapf,KACzBu9B,eAER,CAgBA,MAda,cAAT7zB,IACKnL,KAAK26B,oBAAoBiB,IAAI/a,EAAapf,OAC3CzB,KAAK26B,oBAAoBnkB,IAAIqK,EAAapf,KAAM,IAAI2a,KAGxDpc,KAAK26B,oBAAoB7xB,IAAI+X,EAAapf,MAAM4a,IAAIwE,GAE/C7gB,KAAK06B,YAAYkB,IAAI/a,EAAapf,QACnCzB,KAAK06B,YAAYre,IAAIwE,EAAapf,MAClCzB,KAAKs/B,eAAeze,EAAapf,QAKlCu9B,CACX,CAEAO,gBAAAA,CAAiB1e,EAAc2e,GAC3BA,EAAY7pB,MAAM8pB,IACdz/B,KAAKs6B,WAAW9jB,IAAIqK,EAAapf,KAAMg+B,GACvC5e,EAAahC,WAAa4gB,EAC1Bz/B,KAAK66B,2BAA2Bxe,IAAIwE,EAAapf,MACjDzB,KAAKk8B,cAAe,EACpBl8B,KAAK43B,YAAY,GAEzB,CAEAwH,uBAAAA,EAAwB,WAAEC,EAAU,YAAEL,IAClC,GAAIh/B,KAAKu6B,eAAeqB,IAAIyD,GACxB,OAEJr/B,KAAKu6B,eAAe/jB,IAAI6oB,GAAY,GAGpC,MAAMrE,EAAWqE,EAAWrgB,SAAS+P,IACjC,GAAIjQ,MAAMC,QAAQgQ,GACd,IAAK,IAAI2Q,KAAS3Q,EACdiQ,EAAYv/B,KAAKigC,QAGrBV,EAAYv/B,KAAKsvB,GAGrB/uB,KAAKyc,KAAK,sBAAuB4iB,GAEjCr/B,KAAK2/B,uBAAuBN,EAAW,IAE3Cr/B,KAAKu6B,eAAe/jB,IAAI6oB,EAAYrE,EACxC,CAEA2E,sBAAAA,CAAuBN,GACnB,GAAKr/B,KAAKy6B,qBAAqBmB,IAAIyD,GAAnC,CAIA,IAAK,IAAIxe,KAAgB7gB,KAAKy6B,qBAAqB3xB,IAAIu2B,GACnDr/B,KAAK05B,gBAAgBrd,IAAIwE,GAE7B7gB,KAAK43B,YALL,CAMJ,CAEAgI,2BAAAA,GACI,MAAMC,EAAgB,IAAIzjB,IAAIpc,KAAK63B,SACnC,IAAK,IAAKwH,EAAYS,KAAc9/B,KAAKy6B,qBAAsB,CAC3D,IAAIsF,GAAmB,EAEvB,IAAK,IAAIlf,KAAgBif,EACrB,GAAID,EAAcjE,IAAI/a,GAAe,CACjCkf,GAAmB,EACnB,KACJ,CAGCA,IACD//B,KAAKu6B,eAAezxB,IAAIu2B,GAAYpE,cACpCj7B,KAAKu6B,eAAehe,OAAO8iB,GAC3Br/B,KAAKy6B,qBAAqBle,OAAO8iB,GAEzC,CAEA,IAAK,IAAKW,EAAWF,KAAe9/B,KAAK26B,oBAAqB,CAC1D,IAAIsF,GAAiB,EAErB,IAAK,IAAIpf,KAAgBif,EACrB,GAAID,EAAcjE,IAAI/a,GAAe,CACjCof,GAAiB,EACjB,KACJ,CAGCA,IACDjgC,KAAK26B,oBAAoBpe,OAAOyjB,GAChChgC,KAAK06B,YAAYne,OAAOyjB,GACxBhgC,KAAK46B,mBAAmBre,OAAOyjB,GAEvC,CACJ,CAEA,oBAAMV,CAAeU,GACjB,MAAMlmB,EAAa,CACfyE,KAAMve,KAAKkgC,WAAW3hB,KACtBD,KAAMte,KAAKkgC,WAAW5hB,KACtBd,OAAQxd,KAAK65B,gBAAgBrc,QAGjC,GElewC/R,EFkeyBqO,OEje3DhZ,KAD+ByH,EFkeZvI,KAAK46B,mBAAmB9xB,IAAIk3B,UEje5Bl/B,IAAN2K,EACZlD,IAAMkD,EAGTlD,EAAEgW,OAAS9S,EAAE8S,MAChBhW,EAAE+V,OAAS7S,EAAE6S,MACb/V,EAAEiV,OAAO9J,eAAiBjI,EAAE+R,OAAO9J,cACnCnL,EAAEiV,OAAO5J,cAAgBnI,EAAE+R,OAAO5J,YF2d/B,OEneG,IAA8BrL,EAAGkD,EFqexCzL,KAAK46B,mBAAmBpkB,IAAIwpB,EAAWlmB,GAIvC,MAAMrY,QAAawH,QAAQgD,QAAQ+zB,EAAUlmB,IAG7C,GAAKrY,GAKAzB,KAAK26B,oBAAoBiB,IAAIoE,GAOlC,GAHAhgC,KAAKk8B,cAAe,EACpBl8B,KAAK43B,aAEuB,mBAAjBn2B,EAAKud,QAAwB,CACpC,MAAMggB,EAAc,GACpBh/B,KAAKs6B,WAAW9jB,IAAIwpB,EAAWhB,GAC/B,IAAK,IAAIne,KAAgB7gB,KAAK26B,oBAAoB7xB,IAAIk3B,GAClDnf,EAAahC,WAAamgB,EAG9B,IAAK,IAAIne,KAAgB7gB,KAAK26B,oBAAoB7xB,IAAIk3B,GAC7ChgC,KAAKy6B,qBAAqBmB,IAAIn6B,IAC/BzB,KAAKy6B,qBAAqBjkB,IAAI/U,EAAM,IAAI2a,KAG5Cpc,KAAKy6B,qBAAqB3xB,IAAIrH,GAAM4a,IAAIwE,GAG5C7gB,KAAKo/B,wBAAwB,CACzBC,WAAY59B,EACZu9B,eAER,KAAO,CACHh/B,KAAKs6B,WAAW9jB,IAAIwpB,EAAWv+B,GAC/B,IAAK,IAAIof,KAAgB7gB,KAAK26B,oBAAoB7xB,IAAIk3B,GAClDnf,EAAahC,WAAapd,CAElC,CACJ,CAEA67B,eAAAA,GACI,IAAK,IAAI0C,KAAahgC,KAAK06B,YACvB16B,KAAKs/B,eAAeU,EAE5B,CAEAvC,oBAAAA,GACSz9B,KAAK65B,iBAAoB75B,KAAK65B,gBAAgBrc,SAInDxd,KAAK64B,cLxgBE,UAA+B,aAACC,EAAY,OAAEzM,EAAM,OAAEC,EAAM,OAAE9O,EAAM,OAAEjO,EAAM,iBAAE4wB,EAAgB,cAAEC,EAAa,cAAEC,EAAa,eAAEniB,IAEzIkiB,EAAgBA,EAAc7f,QAAQmK,GAAYA,EAAQnb,OAAOvB,OAEjE,IAAK,IAAIsyB,KAAgBF,EACrBpL,GAAY,CAAE3I,SAAQC,SAAQ9O,UAAS8iB,GAG3C,IAAKxH,EACD,MAAO,CACHzM,SACAC,SACA5Y,aAAc8J,EAAO9J,aACrBC,cAAe6J,EAAO7J,cACtB8W,SAAU,IAAI2V,IAItB,MAAM3V,EAAW,GAEjB,IAAI8V,EAAcC,IAElB,IAAK,IAAIhgC,EAAI,EAAGA,EAAI+O,EAAOjP,OAAQE,IAAK,CACpC,MAAMqgB,EAAetR,EAAO/O,GAE5B,GAAIqgB,EAAamb,OACb,SAGJ,MAAMhuB,EAAO6S,EAAa7S,KAEpByB,EAAQzB,EAAKyB,MACb0O,EAASnQ,EAAKmT,eACd,KAAE7L,EAAI,KAAEC,GAASge,GAAY,IAAIpV,EAAQ1O,UAEzCgxB,EAAQpU,EAAO7O,EAAO9J,cAAgByK,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAEhF,IAAI9c,EAAOof,EAAaQ,YACpBR,EAAalT,wBACblM,EAAOA,EAAK8e,QAAQqB,GAA8B,iBAAbA,EAAM,MAG/C,MAAM8e,EAAerP,GAAa5vB,EAAMg/B,EAAO,CAAEjP,aAAa,IACxDmP,EAAel/B,EAAKi/B,GAE1B,IAAKC,EACD,SAGJ,MAAO5vB,EAAGO,GAAKqvB,EAEf,GAAU,OAAN5vB,EACA,SAGJ,IAAI0S,GAAU1S,EAAIoN,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAAQf,EAAO9J,aACpE,MAAMiX,GAAU,IAAgB,QAAVlb,EAAkB0L,KAAK+J,MAAM5T,GAAKA,GAAKgE,IAAOC,EAAOD,IAASkI,EAAO7J,cAE3F,GAAIgX,EAASnN,EAAO7J,eAAiBgX,EAAS,EAC1C,SAGJ,MAAMiW,EAAkBT,EAAiBvE,IAAI/a,IAAiBwf,EAC9D,IAAIQ,EA/Ee,GAgFfC,EAhFe,GAiFfC,EAjFe,GAmFnB,GAA+B,QAA3BlgB,EAAapS,UAAqB,CAClC,MAAMoT,EAAchB,EAAa7S,KAAKuB,OAAO2S,QAAQrB,GAC/CzC,EAAkByC,EAAa7S,KAAKuB,OAAOjP,QAE3C,cAAEke,EAAa,SAAEC,GAAaR,EAAa,CAC7CC,iBACAC,SACAX,SACAY,oBAKJqF,GAAUjF,EAAc,EAAEhB,EAAOrK,WACjCsQ,GAAWhF,GAAUoD,EAAc,IAAMrE,EAAOrK,WAEhD0tB,EAAqBpiB,EAAS,EAAEjB,EAAOrK,WACvC2tB,EAAqB,IACrBC,EAAoBF,EAAqBC,CAC7C,CAEA,MAAM3L,EAAYha,KAAKgK,IAAI1B,EAAS4I,GAC9B2U,EAAY7lB,KAAKgK,IAAIwF,EAAS2B,GAC9B2I,EAAW9Z,KAAK+Z,KAAMC,GAAY,GAAKxK,EAAS2B,IAAS,GAE/D,GAAI6I,EAAY0L,IAAwBD,GAAmBI,EAAYF,IAAyBF,GAAmB3L,EAAW8L,EAC1H,SAGJ,IAAItzB,EAAQC,EAEZ,MAAMmR,EAAagC,EAAahC,YAAcgC,EAAapf,KAErDw/B,EAAWpiB,EAAWve,UAAYugB,EAAaqgB,QACrD,GAAIrgB,EAAapT,QAAUoT,EAAanT,QAAUuzB,EAAU,CACxD,IAAIE,EAGAA,EADAtiB,EAAWve,SAAWmB,EAAKnB,OACbue,EAAW6hB,GAEHhM,GAAkB7V,EAAY,CAAEtP,OAAQsR,EAAcQ,YAAa5f,IAE7Di/B,GAAc,GAG1C7f,EAAapT,OACbA,EAAS0zB,EAAYtgB,EAAapT,QAC3BoT,EAAaugB,WACpB3zB,EAASsnB,GAAcoM,EAAatgB,IAGpCA,EAAanT,OACbA,EAASyzB,EAAYtgB,EAAanT,QAC3BuzB,IACPvzB,EAASmnB,GAAcsM,EAAatgB,GAE5C,CAEIoU,EAAWsL,IACXA,EAActL,GAGlB,IAAIznB,EAAQuG,EAAS8M,EAAarT,MAAOhN,EAAGqgB,EAAa5M,yBACrD3C,EAAI,GAAKuP,EAAanS,cACtBlB,EAAQqT,EAAanS,cACR,IAAN4C,GAAWuP,EAAahS,gBAC/BrB,EAAQqT,EAAahS,eAGzB4b,EAAShrB,KAAK,CACV21B,WAAY5X,EAAO9J,aACnB+P,OAAQA,EACRkH,OAAQrF,MAAMqF,GAAUnN,EAAO7J,cAAc,EAAIgX,EACjD5Z,IACAO,EACA9D,QACAynB,WACAE,YACAxvB,MAAOnF,EACP+O,OAAQsR,EACRpT,SACAC,SACAmc,eAAgBhJ,EAAagJ,eAC7B+W,mBAER,CAEA,MAAMS,EAAkB5W,EAASlK,QAAO,EAAG0U,WAAU2L,qBAC1C3L,IAAasL,GAAeK,IACpC7U,MAAK,CAACxjB,EAAGkD,IAAMA,EAAEwpB,SAAW1sB,EAAE0sB,WAEjC,MAAO,CACH6D,eACAzM,SACAC,SACA5Y,aAAc8J,EAAO9J,aACrBC,cAAe6J,EAAO7J,cACtB2tB,qBAAsBD,EAAgB/gC,OACtCmqB,SAAU,IAAI2V,KAAkBiB,GAExC,CKiW6BE,CAAsB,CACvCzI,aAAc94B,KAAK64B,cAAcC,aACjCzM,OAAQrsB,KAAK64B,cAAcxM,OAC3BC,OAAQtsB,KAAK64B,cAAcvM,OAC3B9O,OAAQxd,KAAK65B,gBAAgBrc,OAC7BjO,OAAQvP,KAAK63B,QACbsI,iBAAkBngC,KAAK44B,kBACvBwH,cAAepgC,KAAKg5B,eACpBqH,cAAergC,KAAKwhC,gBACpBtjB,eAAgBle,KAAKyhC,cAAcvjB,iBAEvCle,KAAKwhC,iBAAkB,EACvBxhC,KAAK87B,aAAa,wBAAyB97B,KAAK64B,cAAe74B,KAAK0hC,kBACpE1hC,KAAK0hC,iBAAmB,KAC5B,CAEA7D,uBAAAA,GACI,IAAK79B,KAAK65B,kBAAoB75B,KAAK65B,gBAAgBrc,OAC/C,OAGJ,MAAMvK,EAAejT,KAAK65B,gBAAgB5mB,aACpCuK,EAASxd,KAAK65B,gBAAgBrc,OACpC,IAAIjS,EAAQ,KACRo2B,EAAO,KAEX,IAAK,IAAIpyB,KAAUvP,KAAK63B,QAAS,CAC7B,MAAM1Z,EAAS5O,EAAOvB,KAAKmT,cAE3BwgB,EAAO3hC,KAAK+4B,qBAAqBhoB,EAAIkC,EAAakZ,KAG9CnsB,KAAK+4B,qBAAqBhoB,EAAiD,GAA5CkC,EAAa2uB,MAAQpkB,EAAO9J,gBAAmBiuB,GAAQ,KAGtFp2B,EADgB,cAAhBgE,EAAOlC,MAAwC,SAAhBkC,EAAOlC,MAAmC,SAAhBkC,EAAOlC,KACxD,IAAI2D,MAAMhR,KAAK+4B,qBAAqBhoB,EAAIkC,EAAakZ,MAAQ3O,EAAO9J,cAAgByK,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,OAEvHve,KAAK+4B,qBAAqBhoB,EAAIkC,EAAakZ,MAAQ3O,EAAO9J,cAAgByK,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,IAE/H,CACAve,KAAK+4B,qBAAuB,CACxBhoB,EAAG4wB,EACHrwB,EAAGtR,KAAK+4B,qBAAqBznB,EAAI2B,EAAaiZ,IAC9CU,QAAS5sB,KAAK+4B,qBAAqBnM,QACnCrhB,MAAOA,GAEXvL,KAAK87B,aAAa,gCAAiC97B,KAAK+4B,qBAC5D,CAEAiF,uBAAAA,GACSh+B,KAAK65B,iBAAoB75B,KAAK65B,gBAAgBrc,SAInDxd,KAAKm5B,kBGllBE,UAAmC,YAAEC,EAAW,OAAE7pB,EAAM,OAAEiO,EAAM,UAAEsP,IAC7E,MAAM+U,EAAc,IAAIzlB,IAAI7M,EAAOtP,KAAI,CAAC4gB,EAAcrgB,KAC3C,CACHgC,KAAM2zB,GAActV,EAAcrgB,GAClCw7B,OAAQnb,EAAamb,WAE1Bzb,QAAO,EAAGyb,aAAcA,IAAQ/7B,KAAI,EAAGuC,UAAWA,MAE/C,aAAEkR,GAAiB8J,GACnB,KAAEe,EAAI,KAAED,GAASwO,EACjBgV,EAASxjB,EAAOC,EAGtB,OAAe,IAAXujB,EACO,CACH1I,YAAa,GACb1lB,gBA8ED,CACH0lB,YA3E0BA,EAAY7Y,QAAQwhB,IAC9C,IAAKA,EAAWxyB,OACZ,OAAO,EAGX,IAAK,IAAIyyB,KAAcD,EAAWxyB,OAC9B,GAAIsyB,EAAYjG,IAAIoG,GAChB,OAAO,EAIf,OAAO,CAAK,IACb/hC,KAAK8hC,IACJ,MAAME,OAAgCnhC,IAAtBihC,EAAW9wB,aAA4CnQ,IAApBihC,EAAW7wB,KACxDgxB,OAA2BphC,IAAjBihC,EAAWhxB,EAE3B,IAAIoxB,EAAcJ,EAAW9wB,OACzBmxB,EAAYL,EAAW7wB,KAE3B,IAAK+wB,GAAWC,EACZC,EAAcJ,EAAWhxB,EACzBqxB,EAAYL,EAAWhxB,OACpB,IAAKkxB,IAAYC,EACpB,OAAO,KAGX,MAAMG,EAAmBC,GACF,iBAARA,EAAyB,IAAItxB,KAAKsxB,GAAKnb,UAC9Cmb,aAAetxB,KAAasxB,EAAInb,UAC7Bmb,EAGX,IAAIrxB,EAASoxB,EAAgBF,GACzBjxB,EAAOmxB,EAAgBD,GAEvBnxB,EAASC,KACRD,EAAQC,GAAQ,CAACA,EAAMD,IAG5B,IAAIsxB,GAAetxB,EAASsN,GAAQujB,EAASpuB,EACzC8uB,GAAatxB,EAAOqN,GAAQujB,EAASpuB,EAGzC6uB,EAAcpnB,KAAKC,IAAI,EAAGD,KAAKqI,IAAI9P,EAAc6uB,IACjDC,EAAYrnB,KAAKC,IAAI,EAAGD,KAAKqI,IAAI9P,EAAc8uB,IAE/C,IAAIpN,EAAaoN,EAAYD,EAe7B,OAdInN,EAAa,GAAKoN,EAAY,GAAKD,EAAc7uB,KAC3CuuB,GAAWC,GACZ9M,EAAa,EACbmN,GAAe,IAEfnN,EADO6M,EACM,EAEA,GAItBM,EAAcpnB,KAAKC,IAAI,EAAGD,KAAKqI,IAAI9P,EAAe0hB,EAAYmN,IAG1DnN,GAAc,EACP,KAIJ,IACA2M,EACHE,UACAM,cACAnN,aACH,IACF7U,QAAOwhB,GAA6B,OAAfA,IAIpBruB,eAER,CHgfiC+uB,CAA0B,CAC/CrJ,YAAap5B,KAAKk5B,aAClB3pB,OAAQvP,KAAK63B,QACbra,OAAQxd,KAAK65B,gBAAgBrc,OAC7BsP,UAAW9sB,KAAKkgC,aAEpBlgC,KAAK87B,aAAa,sBAAuB97B,KAAKm5B,mBAClD,CAEA4B,aAAAA,GACI/6B,KAAK0iC,aAAe,GACpB,MAAMC,EAAiB,GAEvB,IAAK,IAAI9hB,KAAgB7gB,KAAK63B,QAAS,CACnC,GAAIhX,EAAamb,OACb,SAGJ,MAAMnd,EAAa7e,KAAK++B,oBAAoBle,GAC5CA,EAAaQ,YAAcwM,GAAwB,IAC5ChN,EACHpf,KAAMod,GACP,CACCK,gBAAiBlf,OAErB6gB,EAAa+hB,qBAAuB/jB,EAAWve,OAC/CugB,EAAagiB,WAAanT,GAAoB7O,EAAaQ,aAC5B,QAA3BR,EAAapS,YACboS,EAAagiB,WAAa/R,GAAajQ,EAAagiB,WAAY,CAAE9R,gBAAiBlQ,EAAaQ,YAAY/gB,OAAQ2N,YAAa4S,EAAa5S,eAGlJ00B,EAAeljC,KAAKohB,EAAagiB,YAE7BhiB,EAAa5S,aACbjO,KAAK0iC,aAAajjC,KAAKohB,EAAa5S,YAE5C,CAEAjO,KAAK4/B,8BAEL5/B,KAAK8iC,YAAcnS,GAAYgS,GAE/B3iC,KAAK+iC,sBAAsB,CAAEC,aAAa,IAE1C,IAAK,IAAIniB,KAAgB7gB,KAAK63B,QACtBhX,EAAamb,SAIjBnb,EAAaoiB,eAAiBvT,GAAoB7O,EAAaO,gBAAgB3f,KAAM,CAAEkuB,WAAY3vB,KAAKo4B,YAAaxI,oBAAqB5vB,KAAKq4B,uBAC3IxX,EAAa5R,gBACb4R,EAAaqiB,sBAAwBriB,EAAaoiB,eAClDpiB,EAAasiB,yBAA2BzT,GAAoB7O,EAAauiB,0BAA0B3hC,KAAM,CAAEkuB,WAAY3vB,KAAKo4B,YAAaxI,oBAAqB5vB,KAAKq4B,uBAEnKxX,EAAaoiB,eAAiBtS,GAAY,CACtC9P,EAAaqiB,sBACbriB,EAAasiB,6BAKzBnjC,KAAKqjC,yBAEL,IAAK,IAAIxiB,KAAgB7gB,KAAK63B,QACtBhX,EAAamb,SAIjBh8B,KAAK68B,gCAAgChc,EAAc,CAAE4S,aAAa,IAClEzzB,KAAK+8B,mCAAmClc,EAAc,CAAE4S,aAAa,IAE7E,CAEAkJ,UAAAA,CAAW2G,GACP,MAAMC,EAAU,IAAIxL,IACdyL,EAAe,IAAIpnB,IAEnBqnB,EAA8B,IAAIrnB,IACxC,IAAK,IAAIyE,KAAgByiB,EACrBG,EAA4BpnB,IAAIwE,GAGpC,IAAK,IAAIA,KAAgByiB,EAAgB,CAGrC,GAFAE,EAAannB,IAAIwE,EAAa7S,OAEzB6S,EAAaQ,YACd,MAAM,IAAI9e,MAAM,0DAGpB,MAAMsc,EAAa7e,KAAK++B,oBAAoBle,GAE5C,IAAIrL,EACAqL,EAAaQ,YAAY/gB,SACzBkV,EAAQqL,EAAaQ,YAAYR,EAAaQ,YAAY/gB,OAAS,GAAG,IAG1E,MAAMojC,EAAqB7V,GAAwBhN,EAAc,CAC7Dpf,KAAMod,EAAW8H,MAAM9F,EAAa+hB,sBAAwB,GAC5DrU,YAAa1N,EAAaQ,YAAY/gB,OACtCkV,QACA0J,gBAAiBlf,OAKrB,GAHAujC,EAAQ/sB,IAAIqK,EAAc6iB,GAC1B7iB,EAAa+hB,qBAAuB/jB,EAAWve,OAE3CojC,EAAmBpjC,OAAS,GAC5BugB,EAAaQ,YAAY5hB,QAAQikC,QAEjC,IAAK,IAAI3U,KAAS2U,EACd7iB,EAAaQ,YAAY5hB,KAAKsvB,GAItC,IAAI4U,EAAgBjU,GAAoBgU,GACT,QAA3B7iB,EAAapS,YACbk1B,EAAgB7S,GAAa6S,EAAe,CAAE5S,gBAAiBlQ,EAAaQ,YAAY/gB,OAAQ2N,YAAa4S,EAAa5S,eAG9H4S,EAAagiB,WAAalS,GAAY,CAAC9P,EAAagiB,WAAYc,IAChE3jC,KAAK8iC,YAAcnS,GAAY,CAAC3wB,KAAK8iC,YAAaa,IAGlD9iB,EAAa+iB,cAAgBF,EAAmBpjC,OAChDugB,EAAa8iB,cAAgBA,CACjC,CAEA,MAAME,EAAoB7jC,KAAKkgC,WAC/BlgC,KAAK+iC,wBAEL,IAAK,IAAIliB,KAAgByiB,EAAgB,CACrC,IAAKziB,EAAaO,gBAAgB3f,KAAKnB,OAAQ,CAC3CugB,EAAaoiB,eAAiBvT,GAAoB7O,EAAaO,gBAAgB3f,MAC/E,QACJ,CAEA,MAAMmhB,EAAS/B,EAAaO,gBAAgB3f,KAAK,GAAG,GAC9CqhB,EAAQjC,EAAaO,gBAAgB3f,KAAKof,EAAaO,gBAAgB3f,KAAKnB,OAAS,GAAG,GAI9F,KAFkCujC,EAAkBtlB,MAAQqE,GAAUihB,EAAkBvlB,MAAQwE,IAEzC,MAArB9iB,KAAKo4B,YAAqB,CAGxDvX,EAAaoiB,eAAiBvT,GAAoB7O,EAAaO,gBAAgB3f,KAAM,CAAEkuB,WAAY3vB,KAAKo4B,YAAaxI,oBAAqB5vB,KAAKq4B,uBAC3IxX,EAAa5R,gBACb4R,EAAaqiB,sBAAwBriB,EAAaoiB,eAClDpiB,EAAasiB,yBAA2BzT,GAAoB7O,EAAauiB,0BAA0B3hC,KAAM,CAAEkuB,WAAY3vB,KAAKo4B,YAAaxI,oBAAqB5vB,KAAKq4B,uBAEnKxX,EAAaoiB,eAAiBtS,GAAY,CACtC9P,EAAaqiB,sBACbriB,EAAasiB,4BAGrB,QACJ,CAGA,MAAMW,EAAkBP,EAAQz6B,IAAI+X,GAC/BN,QAAQqB,GAAUA,EAAM,IAAM5hB,KAAKkgC,WAAW3hB,MAAQqD,EAAM,IAAM5hB,KAAKkgC,WAAW5hB,OAEvFuC,EAAaijB,gBAAkBA,EAC/BjjB,EAAaoiB,eAAiBtS,GAAY,CAAC9P,EAAaoiB,eAAgBvT,GAAoBoU,IAChG,CAEA9jC,KAAKqjC,yBAELrjC,KAAK8+B,qBAAqB,sBAAuB9+B,KAAKg4B,MAAM/3B,KAAI,EAAGkhB,mBAAoBA,KAEvF,IAAK,IAAInT,KAAQw1B,EACb,IAAK,IAAI3iB,KAAgB7S,EAAKuB,OAC1BvP,KAAK68B,gCAAgChc,GACrC7gB,KAAK+8B,mCAAmClc,EAGpD,CAEAwiB,sBAAAA,GACI,IAAK,IAAIr1B,KAAQhO,KAAKg4B,MAAO,CACzB,GAAIh4B,KAAKkgC,WAAW6D,SAAW/jC,KAAKm4B,YAAa,CAC7CnqB,EAAKg2B,aAAehkC,KAAKkgC,WACrBlyB,EAAKg2B,aAAaC,SAClBj2B,EAAKg2B,aAAeh2B,EAAKg2B,aAAaC,OAAOj2B,EAAKsB,YAGtDtB,EAAKmT,cAAgBnT,EAAKg2B,aAC1B,QACJ,CAEA,MAAME,EAAqB,GACrBj2B,EAAc,GAEpB,IAAK,IAAI4S,KAAgB7S,EAAKuB,OAC1B20B,EAAmBzkC,KAAKohB,EAAaoiB,gBAEjCpiB,EAAa5S,aACbA,EAAYxO,QAAQohB,EAAa5S,aAGN,QAA3B4S,EAAapS,WACbR,EAAYxO,KAAKohB,EAAagiB,WAAWvtB,KAAMuL,EAAagiB,WAAWttB,MAI/EvH,EAAKm2B,mBAAqBxT,GAAYuT,GACtCl2B,EAAKg2B,aAAeh2B,EAAKmT,cAAgB2P,GAAa9iB,EAAKm2B,mBAAoB,CAACl2B,eACpF,CACAjO,KAAK8+B,qBAAqB,sBAAuB9+B,KAAKg4B,MAAM/3B,KAAI,EAAGkhB,mBAAoBA,IAC3F,CAQA4hB,qBAAAA,EAAsB,YAACC,GAAc,GAAO,CAAC,GACzChjC,KAAKyhC,cAAgB3Q,GAAa9wB,KAAK8iC,YAAa,CAAC70B,YAAajO,KAAK0iC,aAAa9mB,SACpF5b,KAAK8+B,qBAAqB,wBAAyB9+B,KAAKyhC,eACxDzhC,KAAKkgC,WI9yBE,SAAmClf,EAAcojB,GAC5D,MAAMJ,EAAer7B,OAAOsoB,OAAO,CAAC,EAAGjQ,EAAcojB,EAAiBpjB,IAsBtE,OApBIgjB,EAAa1lB,gBAAgBtN,OAC7BgzB,EAAa1lB,KAAO0lB,EAAa1lB,KAAK6I,WAGtC6c,EAAazlB,gBAAgBvN,OAC7BgzB,EAAazlB,KAAOylB,EAAazlB,KAAK4I,WAGtC6c,EAAa1lB,KAAO0lB,EAAazlB,OACjCylB,EAAa1lB,KAAO0lB,EAAazlB,MAGjCylB,EAAazlB,KAAOyC,EAAazC,OACjCylB,EAAazlB,KAAOyC,EAAazC,MAGjCylB,EAAa1lB,KAAO0C,EAAa1C,OACjC0lB,EAAa1lB,KAAO0C,EAAa1C,MAG9B0lB,CACX,CJsxB0BK,CAA0BrkC,KAAKyhC,cAAezhC,KAAK+5B,mBACrE/5B,KAAK8+B,qBAAqB,oBAAqB9+B,KAAKkgC,YAEpD,IAAK,IAAIrf,KAAgB7gB,KAAK63B,QACtBhX,EAAamb,SAIjBnb,EAAaO,gBAAkBuQ,GAAyB,CACpDlwB,KAAMof,EAAa5R,cAAgB4R,EAAaQ,YAAYd,QAAO,CAAC+jB,EAAG9jC,IAAMA,EAAI,GAAM,IAAKqgB,EAAaQ,YACzGuQ,KAAMoR,EAAc,KAAOniB,EAAaO,gBACxC7C,KAAMve,KAAKkgC,WAAW3hB,KACtBD,KAAMte,KAAKkgC,WAAW5hB,KACtB3Q,sBAAuBkT,EAAalT,sBACpCQ,OAAQ0S,EAAa1S,SAGrB0S,EAAa5R,gBACb4R,EAAauiB,0BAA4BzR,GAAyB,CAC9DlwB,KAAKof,EAAaQ,YAAYd,QAAO,CAAC+jB,EAAG9jC,IAAMA,EAAI,GAAM,IACzDoxB,KAAMoR,EAAc,KAAOniB,EAAauiB,0BACxC7kB,KAAMve,KAAKkgC,WAAW3hB,KACtBD,KAAMte,KAAKkgC,WAAW5hB,KACtB3Q,sBAAuBkT,EAAalT,sBACpCQ,OAAQ0S,EAAa1S,UAIrC,CAEA+uB,OAAAA,GACI,GAAKl9B,KAAK65B,iBAAoB75B,KAAK65B,gBAAgBrc,OAAnD,CAIAxd,KAAK65B,gBAAgBvgB,QACjBtZ,KAAK85B,oBACL95B,KAAK85B,mBAAmBxgB,QAG5B,IAAK,IAAIuH,KAAgB7gB,KAAK63B,QAAS,CACnC,GAAIhX,EAAamb,OACb,SAGJ,MAAM9sB,EAAc2R,EAAa3R,aAAe,CAC5CqZ,IAAK,QACLgc,OAAQ,cACRC,MAAO,SACTxkC,KAAKykC,SAAW,QAEZvqB,OAAapZ,EAEnBd,KAAK65B,gBAAgB7V,iBAAiBnD,EAAa6jB,0BAEnD1kC,KAAK65B,gBAAgBjZ,OAAOC,EAAcA,EAAa8jB,qBAAsB,CACzE1qB,YAAaja,KAAKi4B,qBAAuBpX,EAAalb,MACtD6I,qBAAsBxO,KAAKk4B,sBAC3BhpB,cACAgL,aACA6G,iBAAkB/gB,KAAK4kC,kBACvB5jB,aAAchhB,KAAKyhC,cACnBxgB,wBAAyBJ,EAAagkB,iCAGtC7kC,KAAK85B,oBAAsB95B,KAAK85B,mBAAmBtc,QACnDxd,KAAK85B,mBAAmBlZ,OAAOC,EAAcA,EAAaikB,wBAAyB,CAC/E51B,YAAa,cACbgL,WAAY,EACZpM,MAAO,EACPqQ,OAAQne,KAAKyhC,cACbzgB,aAAchhB,KAAKyhC,cACnBxgB,wBAAyBJ,EAAakkB,mCAGlD,CA1CA,CA2CJ,CAEAlI,+BAAAA,CAAgChc,GAAc,YAAE4S,GAAY,GAAU,CAAC,GACnE,IAAKzzB,KAAK65B,kBAAoB75B,KAAK65B,gBAAgBrc,OAC/C,OAGJ,IAAKqD,EAAc,CACf,IAAK,IAAI3W,KAAKlK,KAAK63B,QACf73B,KAAK68B,gCAAgC3yB,GAEzC,MACJ,CAEA,IAAKlK,KAAK63B,QAAQlS,SAAS9E,GACvB,MAAM,IAAIte,MAAM,2BAGpB,GAAIse,EAAamb,OACb,OAGJ,MAAM,cAAE7a,EAAa,MAAE1R,GAAUoR,EAAa7S,KACxC4F,EAAcuH,KAAKsK,KAAKzlB,KAAK65B,gBAAgBrc,OAAO5J,YnCj5BtC,GmCk5BdC,EAAesH,KAAKsK,KAAKzlB,KAAK65B,gBAAgBrc,OAAO3J,cAErDmxB,EAAiC,CACnCzmB,KAAM4C,EAAc5C,KACpBD,KAAM6C,EAAc7C,KACpB1K,cACA6f,eAGJ5S,EAAaokB,gCAAkCxP,GAAkB,CAC7Dh0B,KAAMof,EAAaO,gBAAgB3f,KACnCmwB,KAAM/Q,EAAaokB,mCAChBD,IAGP,MAAME,EAAsB,CACxB3mB,KAAM4C,EAAc5C,KACpBD,KAAM6C,EAAc7C,KACpBhJ,KAAM6L,EAAc7L,KACpBC,KAAM4L,EAAc5L,KACpB3B,cACAC,eACApE,QACAgkB,eAGJ5S,EAAa8jB,qBAAuBnR,GAA2B,CAC3D/xB,KAAMof,EAAaokB,gCAAgCxjC,KACnDmwB,KAAM/Q,EAAa8jB,wBAChBO,IAGPrkB,EAAa6jB,yBAA2BtO,GAA+B,CACnE30B,KAAMof,EAAaokB,gCAAgCxjC,KACnD6M,WAAYuS,EAAavS,WACzBsjB,KAAM/Q,EAAa6jB,yBACnBnmB,KAAM4C,EAAc5C,KACpBD,KAAM6C,EAAc7C,OAGpBuC,EAAa5R,gBACb4R,EAAaskB,0CAA4C1P,GAAkB,CACvEh0B,KAAMof,EAAauiB,0BAA0B3hC,KAC7CmwB,KAAM/Q,EAAaskB,6CAChBH,IAGPnkB,EAAagkB,+BAAiCrR,GAA2B,CACrE/xB,KAAMof,EAAaskB,0CAA0C1jC,KAC7DmwB,KAAM/Q,EAAagkB,kCAChBK,IAGPrkB,EAAaukB,mCAAqChP,GAA+B,CAC7E30B,KAAMof,EAAaskB,0CAA0C1jC,KAC7D6M,WAAYuS,EAAavS,WACzBsjB,KAAM/Q,EAAaukB,mCACnB7mB,KAAM4C,EAAc5C,KACpBD,KAAM6C,EAAc7C,OAGhC,CAEAye,kCAAAA,CAAmClc,GAAc,YAAE4S,GAAY,GAAU,CAAC,GACtE,IAAKzzB,KAAK85B,qBAAuB95B,KAAK85B,mBAAmBtc,OACrD,OAGJ,IAAKqD,EAAc,CACf,IAAK,IAAI3W,KAAKlK,KAAK63B,QACf73B,KAAK+8B,mCAAmC7yB,GAE5C,MACJ,CAEA,IAAKlK,KAAK63B,QAAQlS,SAAS9E,GACvB,MAAM,IAAIte,MAAM,2BAGpB,GAAIse,EAAamb,OACb,OAGJ,MAAM,MAAEvsB,GAAUoR,EAAa7S,KACzBgT,EAAehhB,KAAKyhC,cACpB7tB,EAAcuH,KAAKsK,KAAKzlB,KAAK85B,mBAAmBtc,OAAO5J,YnCv+BzC,GmCw+BdC,EAAesH,KAAKsK,KAAKzlB,KAAK85B,mBAAmBtc,OAAO3J,cAExDwxB,EAAwB,CAC1B9mB,KAAMyC,EAAazC,KACnBD,KAAM0C,EAAa1C,KACnB3Q,sBAAuBkT,EAAalT,sBACpCQ,OAAQ0S,EAAa1S,QAGzB0S,EAAaykB,0BAA4B3T,GAAyB,CAC9DlwB,KAAMof,EAAa5R,cAAgB4R,EAAaQ,YAAYd,QAAO,CAAC+jB,EAAG9jC,IAAMA,EAAI,GAAM,IAAKqgB,EAAaQ,YACzGuQ,KAAM/Q,EAAaykB,6BAChBD,IAGP,MAAML,EAAiC,CACnCzmB,KAAMyC,EAAazC,KACnBD,KAAM0C,EAAa1C,KACnB1K,cACA6f,eAGJ5S,EAAa0kB,mCAAqC9P,GAAkB,CAChEh0B,KAAMof,EAAaykB,0BAA0B7jC,KAC7CmwB,KAAM/Q,EAAa0kB,qCAGvB,MAAML,EAAsB,CACxB3mB,KAAMyC,EAAazC,KACnBD,KAAM0C,EAAa1C,KACnBhJ,KAAM0L,EAAa1L,KACnBC,KAAMyL,EAAazL,KACnB3B,cACAC,eACApE,QACAgkB,eAGJ5S,EAAaikB,wBAA0BtR,GAA2B,CAC9D/xB,KAAMof,EAAa0kB,mCAAmC9jC,KACtDmwB,KAAM/Q,EAAaikB,2BAChBI,IAGHrkB,EAAa5R,gBACb4R,EAAa2kB,oCAAsC7T,GAAyB,CACxElwB,KAAMof,EAAaQ,YAAYd,QAAO,CAAC+jB,EAAG9jC,IAAMA,EAAI,GAAM,IAC1DoxB,KAAM/Q,EAAa2kB,uCAChBH,IAGPxkB,EAAa4kB,6CAA+ChQ,GAAkB,CAC1Eh0B,KAAMof,EAAa2kB,oCAAoC/jC,KACvDmwB,KAAM/Q,EAAa4kB,gDAChBT,IAGPnkB,EAAakkB,kCAAoCvR,GAA2B,CACxE/xB,KAAMof,EAAa4kB,6CAA6ChkC,KAChEmwB,KAAM/Q,EAAakkB,qCAChBG,IAGf,CAEAQ,WAAAA,EAAY,KAAEl2B,IACV,MAAMxB,EAAO,CACTuB,OAAQ,GACRE,MAAO,SACPD,OACAF,UAAWtP,KAAKg4B,MAAM13B,QAG1B,OADAN,KAAKg4B,MAAMv4B,KAAKuO,GACTA,CACX,CAEA23B,SAAAA,CAAU9kB,EAAcvR,GACpB,IAAKtP,KAAK63B,QAAQlS,SAAS9E,GACvB,MAAM,IAAIte,MAAM,2BAGpB,IAAIqjC,EAOJ,GALIA,EADc,aAAdt2B,GAA0C,cAAdA,EAClBtP,KAAK0lC,YAAY,CAAEl2B,KAAMF,EAAU+E,MAAM,KAAK,KAE9CrU,KAAKg4B,MAAMtjB,SAASpF,IAG9BuR,EAAa7S,OAAS43B,EACtB,OAGJ,MAAMC,EAAUhlB,EAAa7S,KACvB83B,EAAWD,EAAQt2B,OAAO2S,QAAQrB,GACxC,IAAkB,IAAdilB,EACA,MAAM,IAAIvjC,MAAM,8BAEpBsjC,EAAQt2B,OAAOpK,OAAO2gC,EAAU,GAEhCF,EAAQr2B,OAAO9P,KAAKohB,GACpBA,EAAa7S,KAAO43B,EAEpB5lC,KAAKk8B,cAAe,EACpBl8B,KAAK87B,aAAa,eAAgB97B,KAAKg4B,OACvCh4B,KAAK87B,aAAa,oBAAqB97B,KAAK+lC,UAC5C/lC,KAAK87B,aAAa,qBAAsB97B,KAAKgmC,WAC7ChmC,KAAK87B,aAAa,wBAAyB97B,KAAKimC,cAChDjmC,KAAK43B,YACT,CAEAmE,aAAAA,CAAclb,GACV,GAAIA,EAAa7S,MAAqC,iBAAtB6S,EAAa7S,KACzC,OAGJ,IAAIA,EAEJ,GAAI6S,EAAavR,UAAW,CACxB,MAAM,UAAEA,GAAcuR,EAGlB7S,EADc,aAAdsB,GAA0C,cAAdA,EACrBtP,KAAK0lC,YAAY,CAAEl2B,KAAMF,EAAU+E,MAAM,KAAK,KAE9CrU,KAAKg4B,MAAMtjB,SAASpF,GAEnC,MAAO,GAAIuR,EAAa7S,KAAM,CAC1B6S,EAAaqlB,aAAerlB,EAAa7S,KACzC,IAAKwB,EAAMxM,GAAU6d,EAAa7S,KAAKqG,MAAM,KAC7CrG,EKjmCG,UAA0B,KAAEsS,EAAI,KAAE9Q,EAAI,OAAExM,IAOnD,IAAIgL,EALAhL,EADAA,GACS0R,SAAS1R,IAET,EAIb,IAAImjC,EAAO,EACX,IAAK,IAAIC,KAAiB9lB,EACtB,GAAI8lB,EAAc52B,OAASA,EAA3B,CAIA,GAAI22B,IAASnjC,EAAQ,CACjBgL,EAAOo4B,EACP,KACJ,CAEAD,GAPA,CAUJ,OAAOn4B,CACX,CL0kCmBq4B,CAAiB,CAAE/lB,KAAMtgB,KAAKg4B,MAAOxoB,OAAMxM,WAE7CgL,IACDA,EAAOhO,KAAK0lC,YAAY,CACpBl2B,SAGZ,MACIxB,EAAOhO,KAAKg4B,MAAM,GAGtBhqB,EAAKuB,OAAO9P,KAAKohB,GACjBA,EAAa7S,KAAOA,EAEpBhO,KAAK87B,aAAa,eAAgB97B,KAAKg4B,OACvCh4B,KAAK87B,aAAa,wBAAyB97B,KAAKimC,cAEjB,SAA3BplB,EAAa7S,KAAKwB,KAClBxP,KAAK87B,aAAa,oBAAqB97B,KAAK+lC,UAE5C/lC,KAAK87B,aAAa,qBAAsB97B,KAAKgmC,UAErD,CAEA9K,aAAAA,CAAcra,GACV7gB,KAAK83B,0BAA0Bvb,OAAOsE,EAAa4a,gBAEnD,MAAM,KAAEztB,EAAI,KAAEvM,GAASof,EACvB7S,EAAKuB,OAAOpK,OAAO6I,EAAKuB,OAAO2S,QAAQrB,GAAe,GACtD,MAAMoe,EAAcj/B,KAAKy6B,qBAAqB3xB,IAAIrH,GAC9Cw9B,IACAA,EAAY1iB,OAAOsE,GACM,IAArBoe,EAAYziB,MACZxc,KAAKy6B,qBAAqBle,OAAO9a,IAIrCzB,KAAK26B,oBAAoBiB,IAAIn6B,KAC7BzB,KAAK26B,oBAAoB7xB,IAAIrH,GAAM8a,OAAOsE,GACM,IAA5C7gB,KAAK26B,oBAAoB7xB,IAAIrH,GAAM+a,OACnCxc,KAAK26B,oBAAoBpe,OAAO9a,GAChCzB,KAAK06B,YAAYne,OAAO9a,KAIhCzB,KAAK44B,kBAAkBrc,OAAOsE,GAE9BA,EAAa7S,KAAO6S,EAAaqlB,oBAC1BrlB,EAAaqlB,oBACbrlB,EAAaQ,mBACbR,EAAaO,uBACbP,EAAaylB,2BACbzlB,EAAa0lB,8BACb1lB,EAAa8jB,4BACb9jB,EAAaikB,+BACbjkB,EAAa+iB,qBACb/iB,EAAa8iB,qBACb9iB,EAAa+hB,qBAEpB5iC,KAAK87B,aAAa,eAAgB97B,KAAKg4B,OACvCh4B,KAAK87B,aAAa,wBAAyB97B,KAAKimC,cAE9B,SAAdj4B,EAAKwB,KACLxP,KAAK87B,aAAa,oBAAqB97B,KAAK+lC,UAE5C/lC,KAAK87B,aAAa,qBAAsB97B,KAAKgmC,UAErD,CAEA/J,WAAAA,CAAYpb,GACR,MAAM,KAAE7S,GAAS6S,EACXgB,EAAc7T,EAAKuB,OAAO2S,QAAQrB,GACxCA,EAAagB,YAAcA,EAC3B7T,EAAKuB,OAAOpK,OAAO0c,EAAa,GAEhC7hB,KAAK87B,aAAa,eAAgB97B,KAAKg4B,OAErB,SAAdhqB,EAAKwB,KACLxP,KAAK87B,aAAa,oBAAqB97B,KAAK+lC,UAE5C/lC,KAAK87B,aAAa,qBAAsB97B,KAAKgmC,UAErD,CAEAQ,WAAAA,CAAY3lB,GACR,MAAM,KAAE7S,GAAS6S,EACjB7S,EAAKuB,OAAOpK,OAAO0b,EAAagB,YAAa,EAAGhB,GAEhD7gB,KAAK87B,aAAa,eAAgB97B,KAAKg4B,OAErB,SAAdhqB,EAAKwB,KACLxP,KAAK87B,aAAa,oBAAqB97B,KAAK+lC,UAE5C/lC,KAAK87B,aAAa,qBAAsB97B,KAAKgmC,UAErD,CAOA,mBAAIS,GACA,OAAOzmC,KAAK+5B,iBAChB,CAEA,QAAIzZ,GACA,OAAOtgB,KAAKg4B,KAChB,CAEA,YAAI+N,GACA,MAAMA,EAAW/lC,KAAKg4B,MAAMzX,QAAO,EAAG/Q,OAAMD,YAAsB,SAATC,GAAmBD,EAAOjP,OAAS,IAAGomC,UAM/F,OAJwB,IAApBX,EAASzlC,QAA0C,IAA1BN,KAAKgmC,UAAU1lC,QACxCylC,EAAStmC,KAAKO,KAAKg4B,MAAM,IAGtB+N,CACX,CAEA,aAAIC,GACA,OAAOhmC,KAAKg4B,MAAMzX,QAAO,EAAG/Q,OAAMD,YAAsB,UAATC,GAAoBD,EAAOjP,OAAS,GACvF,CAEA,UAAI6d,GACA,OAAOne,KAAKg4B,MAAM/3B,KAAI,EAAG+jC,kBAAmBA,GAChD,CAEA,aAAIlX,GACA,OAAO9sB,KAAKkgC,UAChB,CAEA,gBAAIlf,GACA,OAAOhhB,KAAKyhC,aAChB,CAEA,UAAIlyB,GACA,OAAOvP,KAAK63B,OAChB,CAEA,qBAAI8O,GACA,OAAO3mC,KAAKi4B,kBAChB,CAEA,wBAAIzpB,GACA,OAAOxO,KAAKk4B,qBAChB,CAEA,cAAI0O,GACA,OAAO5mC,KAAKm4B,WAChB,CAEA,gBAAI0O,GACA,MAAO,CACHC,cAAe9mC,KAAKq6B,aAAer6B,KAAKo6B,eAAe95B,OAAS,EAChEymC,kBAAmB/mC,KAAKq6B,aAAe,EAE/C,CAEA,gBAAI2M,GACA,OAAOhnC,KAAK64B,aAChB,CAEA,oBAAIoO,GACA,OAAOjnC,KAAK+4B,oBAChB,CAEA,oBAAIoH,GACA,OAAOngC,KAAK44B,iBAChB,CAEA,aAAIsO,GACA,OAAOlnC,KAAKi5B,UAChB,CAEA,mBAAIkO,GACA,OMxxCD,SAA0BC,GAC7B,MAAMhjC,EAAS,CAAC,EAEhB,IAAK,IAAIk6B,KAAY8I,EACjB,IAAK,IAAK3+B,EAAK8C,KAAU5C,OAAO8b,QAAQ6Z,GACpCl6B,EAAOqE,IAAQrE,EAAOqE,IAAQ,GAAK8C,EAI3C,IAAK,IAAK9C,EAAK8C,KAAU5C,OAAO8b,QAAQrgB,GACpCA,EAAOqE,GAAO8C,EAAM67B,EAAU9mC,OAGlC,OAAO8D,CACX,CN0wCeijC,CAAiBrnC,KAAKu5B,cACjC,CAEA,gBAAI0M,GACA,MAAMqB,EAAa,IAAIvP,IACvB,IAAIwP,EAAY,EACZC,EAAa,EAEjB,IAAK,IAAIx5B,KAAQhO,KAAKg4B,MAAO,CACzB,IAAIx1B,EACc,SAAdwL,EAAKwB,MACLhN,EAAQ,QAAO+kC,IACfA,MAEA/kC,EAAQ,SAAQglC,IAChBA,KAGJ,IAAK,IAAI3mB,KAAgB7S,EAAKuB,OAC1B+3B,EAAW9wB,IAAIqK,EAAcre,EAErC,CAEA,OAAOxC,KAAKuP,OAAOtP,KAAK4gB,IACb,IACAA,EAAa4a,eAChBztB,KAAMs5B,EAAWx+B,IAAI+X,MAGjC,CAEA,cAAI8O,GACA,OAAO3vB,KAAKo4B,WAChB,CAEA,uBAAIxI,GACA,OAAO5vB,KAAKq4B,oBAChB,CAEA,kBAAIoP,GACA,OAAOznC,KAAKs4B,eAChB,CAEA,gBAAIpN,GACA,OAAOlrB,KAAKu4B,aAChB,CAEA,kBAAImP,GACA,OAAO1nC,KAAKw4B,eAChB,CAEA,sBAAImP,GACA,OAAO3nC,KAAKy4B,mBAChB,CAEA,qBAAImP,GACA,OAAO5nC,KAAK63B,QAAQtX,QAAQM,GAAiBA,EAAaya,aAC9D,CAEA,aAAI/D,GACA,OAAOv3B,KAAK04B,UAChB,CAEA,mBAAImP,GACA,OAAO7nC,KAAKm5B,iBAChB,CAEA,UAAI3b,GACA,OAAOxd,KAAK65B,iBAAmB75B,KAAK65B,gBAAgBrc,MACxD,CAEA,SAAIsqB,GACA,OAAO9nC,KAAKykC,MAChB,CAEA,cAAIsD,GACA,OAAO/nC,KAAKgoC,WAChB,CAEA,WAAIC,GACA,OAAOjoC,KAAKq5B,QAChB,CAEA,YAAI+H,GACA,OAAOphC,KAAKs5B,SAChB,CAOAlV,eAAAA,CAAgB8jB,GACRA,IAAaloC,KAAK65B,iBAClB75B,KAAK87B,aAAa,sBAAuB97B,KAAK65B,gBAAgBrc,QAC9Dxd,KAAK87B,aAAa,+BAAgC97B,KAAK65B,gBAAgB5mB,cACvEjT,KAAK48B,qBAAsB,GACpBsL,IAAaloC,KAAK85B,qBACzB95B,KAAK87B,aAAa,0BAA2B97B,KAAK85B,mBAAmBtc,QACrExd,KAAK87B,aAAa,mCAAoC97B,KAAK85B,mBAAmB7mB,cAC9EjT,KAAK88B,wBAAyB,GAGlC98B,KAAKy8B,eAAgB,EACrBz8B,KAAK67B,kBAAmB,EACxB77B,KAAK08B,qBAAsB,EAC3B18B,KAAKq9B,qBAAsB,EAC3Br9B,KAAK43B,YACT,CAEA,SAAIkQ,CAAMv8B,GACNvL,KAAKykC,OAASl5B,EACdvL,KAAKy8B,eAAgB,EACrBz8B,KAAK87B,aAAa,eAAgB97B,KAAKykC,QACvCzkC,KAAK43B,YACT,CAEA,cAAImQ,CAAWx8B,GACXvL,KAAKgoC,YAAcz8B,EAEfA,GACAvL,KAAKmoC,gBAAkBnoC,KAAK8nC,MAC5B9nC,KAAK8nC,MAAQ,UAEb9nC,KAAK8nC,MAAQ9nC,KAAKmoC,gBAGtBnoC,KAAK87B,aAAa,qBAAsB97B,KAAKgoC,aAC7ChoC,KAAK43B,YACT,CAEA,oBAAI7W,CAAiBxV,GACjBvL,KAAK4kC,kBAAoBr5B,EACzBvL,KAAKy8B,eAAgB,EACrBz8B,KAAK43B,YACT,CAEA,mBAAI6O,CAAgB2B,GACXA,GAIDA,IAAqBpoC,KAAK+5B,oBAI1BqO,EAAiBC,iBACjBx9B,aAAa7K,KAAKsoC,8BAClBtoC,KAAKsoC,6BAA+Br9B,YAAW,KAC3CjL,KAAKuoC,6BAA6BH,EAAiB,GACpD,MAEHpoC,KAAKuoC,6BAA6BH,GAGtCpoC,KAAK+5B,kBAAoBqO,EACzBpoC,KAAK87B,aAAa,2BAA4B97B,KAAK+5B,mBACnD/5B,KAAKk8B,cAAe,EACpBl8B,KAAKq9B,qBAAsB,EAC3Br9B,KAAK43B,aACT,CAEA,yBAAIZ,CAAsBwR,GACtBxoC,KAAKyoC,uBAAyBzoC,KAAKyoC,wBAA0B,CAAC,EAE9D,MAAMC,EAA8B,CAAC,EAErC,IAAK,IAAI,MAAEh5B,EAAK,WAAEG,KAAgB24B,EAC9BE,EAA4Bh5B,GAASG,EAEjC7P,KAAK+5B,oBAAsB/5B,KAAKyoC,uBAAuB/4B,IAAU1P,KAAK+5B,oBAAsBlqB,IAC5F7P,KAAKymC,gBAAkB52B,GAI/B7P,KAAKyoC,uBAAyBC,CAClC,CAEAH,4BAAAA,CAA6BH,GACzBpoC,KAAKq6B,eACLr6B,KAAKo6B,eAAiBp6B,KAAKo6B,eAAezT,MAAM,EAAG3mB,KAAKq6B,cACxDr6B,KAAKo6B,eAAe36B,KAAK2oC,GACzBpoC,KAAKyc,KAAK,wBAAyBzc,KAAK6mC,aAC5C,CAEA8B,mBAAAA,CAAoBC,GAChB5oC,KAAKyc,KAAK,eAAgBzc,KAAK63B,QAAQ+Q,GAAsBA,EACjE,CAEAC,oBAAAA,CAAqBlC,GACjB3mC,KAAKi4B,mBAAqB0O,EAC1B3mC,KAAK87B,aAAa,6BAA8B6K,GAChD3mC,KAAKy8B,eAAgB,EACrBz8B,KAAK43B,YACT,CAEAkR,sBAAAA,GACI9oC,KAAKk4B,uBAAyBl4B,KAAKk4B,sBACnCl4B,KAAK87B,aAAa,iCAAkC97B,KAAKk4B,uBACzDl4B,KAAKy8B,eAAgB,EACrBz8B,KAAK43B,YACT,CAEAmR,kBAAAA,GACI/oC,KAAKm4B,aAAen4B,KAAKm4B,YACzBn4B,KAAK87B,aAAa,sBAAuB97B,KAAKm4B,aAC9Cn4B,KAAK43B,YACT,CAEAoR,gBAAAA,GACIhpC,KAAK+nC,YAAc/nC,KAAKgoC,WAC5B,CAEAiB,sBAAAA,CAAuBC,GACnBlpC,KAAKymC,gBO5+CE,UAAsC,UAAEp0B,EAAS,UAAEC,EAAS,UAAE62B,EAAS,UAAEC,IAAY,aAAE11B,EAAY,cAAEC,EAAa,UAAEmZ,EAAS,KAAExM,IAC1I,GAAInF,KAAKgK,IAAI7S,EAAYD,GAAa,GAAK8I,KAAKgK,IAAIikB,EAAYD,GAAa,EACzE,OAGJ,MAAM5qB,EAAQlM,EAAUqB,GAAeoZ,EAAUxO,KAAOwO,EAAUvO,MAAQuO,EAAUvO,KAC9ED,EAAQhM,EAAUoB,GAAeoZ,EAAUxO,KAAOwO,EAAUvO,MAAQuO,EAAUvO,KAE9E0lB,EAAS,GACf,IAAK,IAAI,cAAE9iB,EAAa,MAAE1R,KAAW6Q,EAAM,CACvC,MAAMsT,EAAeL,GAAY,IAAKpS,EAAe1R,UACrD,IAAI8F,GAAQ,EAAI4zB,EAAUx1B,IAAgBigB,EAAare,KAAOqe,EAAate,MAAQse,EAAate,KAC5FA,GAAQ,EAAI8zB,EAAUz1B,IAAgBigB,EAAare,KAAOqe,EAAate,MAAQse,EAAate,KAElF,QAAV7F,IACA6F,EAAO6F,KAAKkuB,IAAI,GAAI/zB,GACpBC,EAAO4F,KAAKkuB,IAAI,GAAI9zB,IAExB0uB,EAAOxkC,KAAK,CACR8e,OACAD,OACAhJ,OACAC,QAER,CAEA,MAAO,KACI,CACHgJ,OACAD,OACA2lB,UAGZ,CP28C+BqF,CAA6BJ,EAAgB,CAChEx1B,aAAc1T,KAAK65B,gBAAgBrc,OAAO9J,aAC1CC,cAAe3T,KAAK65B,gBAAgBrc,OAAO7J,cAC3CmZ,UAAW9sB,KAAKkgC,WAChB5f,KAAMtgB,KAAKg4B,OAEnB,CAEAuR,UAAAA,GACIvpC,KAAKq6B,eACLr6B,KAAK+5B,kBAAoB/5B,KAAKo6B,eAAep6B,KAAKq6B,cAClDr6B,KAAK87B,aAAa,2BAA4B97B,KAAK+5B,mBACnD/5B,KAAK87B,aAAa,wBAAyB97B,KAAK6mC,cAChD7mC,KAAKk8B,cAAe,EACpBl8B,KAAK43B,YACT,CAEA4R,cAAAA,GACIxpC,KAAKq6B,eACLr6B,KAAK+5B,kBAAoB/5B,KAAKo6B,eAAep6B,KAAKq6B,cAClDr6B,KAAK87B,aAAa,2BAA4B97B,KAAK+5B,mBACnD/5B,KAAK87B,aAAa,wBAAyB97B,KAAK6mC,cAChD7mC,KAAKk8B,cAAe,EACpBl8B,KAAK43B,YACT,CAEA6R,QAAAA,EAAS,UAAEn6B,EAAS,MAAEI,IAClB1P,KAAKg4B,MAAM1oB,GAAWI,MAAQA,EAC9B1P,KAAK87B,aAAa,eAAgB,IAAI97B,KAAKg4B,QAC3Ch4B,KAAK43B,YACT,CAEA8R,WAAAA,EAAY,UAAEp6B,IACV,MAAMq6B,EAAW3pC,KAAKg4B,MAAM1oB,GAAWG,MACvCzP,KAAKg4B,MAAM1oB,GAAWG,MAAqB,QAAbk6B,EAAqB,SAAW,MAE9D3pC,KAAKk8B,cAAe,EACpBl8B,KAAK87B,aAAa,eAAgB,IAAI97B,KAAKg4B,QAC3Ch4B,KAAK43B,YACT,CAEAgS,mBAAAA,GACI5pC,KAAK65B,gBAAgB7U,sBACrBhlB,KAAK6pC,wBAAwB,CACzBC,QAAS9pC,KAAK+pC,gBACdC,QAAShqC,KAAKiqC,gBACdC,SAAUlqC,KAAKmqC,sBACfC,eAAgBpqC,KAAKwhC,gBACrB6I,gBAAiBrqC,KAAK0hC,kBAE9B,CAEAmI,uBAAAA,EAAwB,QAAEC,EAAO,QAAEE,EAAO,SAAEE,EAAQ,OAAE7d,EAAM,OAAEC,EAAM,eAAE8d,EAAc,gBAAEC,IAClF,MAAM7sB,EAASxd,KAAK65B,gBAAgBrc,OACpC,IAAKA,EACD,OAGJ,GAAuB,iBAAZssB,GAGP,GAFA9pC,KAAK+pC,gBAAkBD,EAEnBA,EAAUtsB,EAAOvK,aAAakZ,MAAQ2d,EAAUtsB,EAAOvK,aAAa2uB,MAEpE,YADA5hC,KAAKsqC,6BAGN,GAAsB,iBAAXhe,EACd,OAGJ,GAAuB,iBAAZ0d,GAGP,GAFAhqC,KAAKiqC,gBAAkBD,EAEnBA,EAAUxsB,EAAOvK,aAAaiZ,KAAO8d,EAAUxsB,EAAOvK,aAAas3B,OAEnE,YADAvqC,KAAKsqC,6BAGN,GAAsB,iBAAXhe,EACd,OAGJ,MAAMke,EAAYne,GAAWyd,EAAUtsB,EAAOvK,aAAakZ,KACrDse,EAAYne,GAAW0d,EAAUxsB,EAAOvK,aAAaiZ,IACvDlsB,KAAK64B,cAAcC,cAAgB0R,IAAcxqC,KAAK64B,cAAcxM,QAAUoe,IAAczqC,KAAK64B,cAAcvM,SAInHtsB,KAAK67B,kBAAmB,EACxB77B,KAAK64B,cAAcC,cAAe,EAClC94B,KAAK64B,cAAcxM,OAASme,EAC5BxqC,KAAK64B,cAAcvM,OAASme,EAC5BzqC,KAAKmqC,sBAAwBD,EAC7BlqC,KAAKwhC,gBAAkB4I,EACvBpqC,KAAK0hC,iBAAmB2I,EACxBrqC,KAAK43B,aACT,CAEA8S,2BAAAA,EAA4B,QAAEZ,EAAO,QAAEE,IACnChqC,KAAK+4B,qBAAuB,CAAEhoB,EAAG+4B,EAASx4B,EAAG04B,EAASpd,SAAU5sB,KAAK+4B,qBAAqBnM,SAC1F5sB,KAAK49B,qBAAsB,EAC3B59B,KAAK43B,YACT,CAEA+S,sBAAAA,CAAuB9pB,EAAcqpB,GACjC,GAAIlqC,KAAK44B,kBAAkBgD,IAAI/a,GACvBqpB,EACAlqC,KAAK44B,kBAAkBtf,QAEvBtZ,KAAK44B,kBAAkBrc,OAAOsE,QAGlC,GAAIqpB,EACA,IAAK,IAAI36B,KAAUvP,KAAK63B,QACpB73B,KAAK44B,kBAAkBvc,IAAI9M,QAG/BvP,KAAK44B,kBAAkBvc,IAAIwE,GAInC7gB,KAAK67B,kBAAmB,EACxB77B,KAAK87B,aAAa,4BAA6B97B,KAAK44B,mBACpD54B,KAAK43B,YACT,CAEA0S,qBAAAA,CAAsBD,GACbrqC,KAAK64B,cAAcC,eAIxB94B,KAAK67B,kBAAmB,EACxB77B,KAAK64B,cAAcC,cAAe,EAClC94B,KAAK0hC,iBAAmB2I,EACxBrqC,KAAK43B,aACT,CAEAgT,aAAAA,EAAc,QAAEd,IACZ,IAAK9pC,KAAKgc,WAAyB,aAC/B,OAGJ,MAAM/I,EAAejT,KAAK65B,gBAAgB5mB,aACpCuK,EAASxd,KAAK65B,gBAAgBrc,OAEpC,IAAK,IAAIjO,KAAUvP,KAAK63B,QAAS,CAC7B,MAAM1Z,EAAS5O,EAAOvB,KAAKmT,cAErBpQ,GAAK+4B,EAAU72B,EAAakZ,MAAQ3O,EAAO9J,cAAgByK,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KACrGve,KAAKyc,KAAK,eAAgB,CAAE1L,IAAGxB,UACnC,CACJ,CAEAs7B,kBAAAA,GACI,MAAMC,EAAmB9qC,KAAKg5B,eAC9Bh5B,KAAKg5B,eL16CN,UAA4B,gBAAE+R,EAAe,cAAE3K,IAClD,IAAK2K,EAAgBzqC,OACjB,OAAO8/B,EAGX,MAAM4K,EAAcD,EAAgBA,EAAgBzqC,OAAS,GAC7D,GAAI0qC,EAAY7V,UA7NO,KA6N6B6V,EAAYpK,iBAAmBoK,EAAY/V,SA7NxE,GA8NnB,OAAOmL,EAGX,MAAM6K,EAAsB7K,EAAc8K,WAAWxgB,GAC1CA,EAAQ3Z,IAAMi6B,EAAYj6B,GAAK2Z,EAAQpZ,IAAM05B,EAAY15B,IAGpE,OAA6B,IAAzB25B,EACO,IAAI7K,EAAe4K,GAEnB5K,EAAc7f,QAAO,CAAC+jB,EAAG3+B,IAAUA,IAAUslC,GAE5D,CKu5C8BJ,CAAmB,CACrCE,gBAAiB/qC,KAAK64B,cAAcpO,SACpC2V,cAAepgC,KAAKg5B,iBAExBh5B,KAAK67B,iBAAmB77B,KAAKg5B,iBAAmB8R,EAChD9qC,KAAK43B,YACT,CAEAuT,kBAAAA,GACuC,IAA/BnrC,KAAKg5B,eAAe14B,SAIxBN,KAAKg5B,eAAiB,GACtBh5B,KAAK67B,kBAAmB,EACxB77B,KAAK43B,aACT,CAEAwT,aAAAA,GACQprC,KAAKi5B,aAITj5B,KAAKi5B,YAAa,EAClBj5B,KAAK87B,aAAa,qBAAsB97B,KAAKi5B,YAC7Cj5B,KAAK43B,aACT,CAEAyT,YAAAA,CAAaC,EAAeh8B,EAAWioB,GACnC,IAAKv3B,KAAKi5B,WACN,OAGJj5B,KAAKi5B,YAAa,EAClBj5B,KAAK87B,aAAa,qBAAsB97B,KAAKi5B,YAE7C,MAAMsS,EAAUj8B,GAA2B,IAAdA,EACvBk8B,EAAgBjU,IAAcv3B,KAAK04B,WAErC6S,GAAWC,GACXxrC,KAAK2lC,UAAU2F,EAAeh8B,GAC9BtP,KAAK87B,aAAa,uBAAwB,CAAEwP,gBAAeh8B,YAAWioB,eAC/DA,GACPv3B,KAAK87B,aAAa,uBAAwB,CAAEwP,gBAAeh8B,YAAWioB,cAG1Ev3B,KAAK43B,YACT,CAEA,oBAAI6T,CAAiBlgC,GACI,iBAAVA,IAIXvL,KAAKu5B,cAAgB,GACrBv5B,KAAKw5B,aAAe,EACpBx5B,KAAKy5B,kBAAoBluB,EAC7B,CAEA,cAAIokB,CAAWpkB,QACGzK,IAAVyK,IAIJvL,KAAK87B,aAAa,qBAAsBvwB,GAE1B,KAAVA,IACAA,EAAQ,KAGZA,EAAQgJ,WAAWhJ,IACd+Z,MAAM/Z,IAAUA,GAAS,KAAOA,GAAS,IAC1CvL,KAAKo4B,YAAc7sB,EACnBvL,KAAKk8B,cAAe,GAGxBl8B,KAAK43B,aACT,CAEA,uBAAIhI,CAAoBrkB,QACNzK,IAAVyK,IAIJvL,KAAK87B,aAAa,+BAAgCvwB,GAEpC,KAAVA,IACAA,EAAQ,GAGZA,EAAQgJ,WAAWhJ,IACd+Z,MAAM/Z,IAAUA,GAAS,IAAMA,IAAU,KAC1CvL,KAAKq4B,qBAAuB9sB,EAC5BvL,KAAKk8B,cAAe,GAGxBl8B,KAAK43B,aACT,CAEA,kBAAI6P,CAAel8B,QACDzK,IAAVyK,IAIJvL,KAAKs4B,gBAAkB/sB,EACvBvL,KAAK87B,aAAa,0BAA2BvwB,GAC7CvL,KAAK43B,aACT,CAEA8T,oBAAAA,GACI1rC,KAAKynC,gBAAkBznC,KAAKynC,cAChC,CAEAkE,kBAAAA,GACI3rC,KAAKu4B,eAAiBv4B,KAAKu4B,cAC3Bv4B,KAAK87B,aAAa,wBAAyB97B,KAAKu4B,eAChDv4B,KAAK43B,YACT,CAEAgU,wBAAAA,GACI5rC,KAAKy4B,qBAAuBz4B,KAAKy4B,oBACjCz4B,KAAK87B,aAAa,8BAA+B97B,KAAKy4B,qBACtDz4B,KAAK43B,YACT,CAEAiU,oBAAAA,GACI7rC,KAAKw4B,iBAAmBx4B,KAAKw4B,gBAC7Bx4B,KAAK87B,aAAa,0BAA2B97B,KAAKw4B,iBAClDx4B,KAAK43B,YACT,CAEAkU,UAAAA,CAAWjrB,EAAc+L,GACrB/L,EAAamb,QAAUpP,EACvB5sB,KAAK63B,QAAU,IAAI73B,KAAK63B,SAEpBhX,EAAamb,OACbh8B,KAAKi8B,YAAYpb,GAEjB7gB,KAAKwmC,YAAY3lB,GAGrB7gB,KAAK87B,aAAa,iBAAkB97B,KAAK63B,QAAS,CAAEkU,YAAY,IAChE/rC,KAAKk8B,cAAe,EACpBl8B,KAAK43B,YACT,CAEA,eAAIwB,CAAY7tB,GACZvL,KAAKk5B,aAAe3tB,GAAS,GAC7BvL,KAAK08B,qBAAsB,EAC3B18B,KAAK43B,YACT,CAUAvJ,YAAAA,CAAa9iB,EAAOsV,EAAcmrB,GAC9B,MAAMC,EAAgBjsC,KAAKq5B,SAAS9tB,GACpC,GAA6B,iBAAlB0gC,EACP,OAAOA,EAGX,MAAMC,EAAavjC,OAAOQ,KAAKnJ,KAAKq5B,UAAU/4B,OAc9C,OAbAN,KAAKq5B,SAAS9tB,GAAS2gC,EAGvBlsC,KAAK63B,QAAQhX,EAAalb,OAAOu7B,SAAU,EACvC8K,IACAhsC,KAAK63B,QAAQhX,EAAalb,OAAOy7B,UAAW,EAC5CphC,KAAKs5B,WAAY,EACjBt5B,KAAK87B,aAAa,oBAAqB97B,KAAKs5B,WAC5Ct5B,KAAK87B,aAAa,oBAAqB97B,KAAKq5B,WAGhDr5B,KAAK87B,aAAa,kBAAmB97B,KAAKq5B,UAEnC6S,CACX,CAEAC,aAAAA,GACInsC,KAAK07B,aAAc,EACnB17B,KAAK43B,YACT,EQ/zDG,SAASwU,GAASC,EAAalwB,EAAWmwB,EAAa,KAAMC,EAAM,IACtE,GAA4B,mBAAjBD,EAA6B,CACpC,MAAME,EAAuBF,EAC7BA,EAAeA,IAAME,CACzB,CAEA,MAAOjhC,EAAOkhC,IAAYC,EAAAA,EAAAA,UAASJ,GAiBnC,OAfAK,EAAAA,EAAAA,YAAU,KACN,MAAM3R,EAAY4R,IACd,GAA4B,mBAAjBA,EAA6B,CACpC,MAAMC,EAAuBD,EAC7BA,EAAeA,IAAMC,CACzB,CACAJ,EAASG,EAAa,EAI1B,OADAP,EAAYnwB,GAAGC,EAAW6e,GACnB,KACHqR,EAAY/vB,IAAIH,EAAW6e,EAAS,CACvC,GACF,IAAIuR,EAAOE,EAAUJ,IAEjB9gC,CACX,CAEO,SAASuhC,GAAe5tB,GAC3B,OAAOktB,GAASltB,EAAiB,sBAAuBA,EAAgB2a,gBAAkB3a,EAAgB2a,gBAAgBrc,OAAS,CAC/H9J,aAAc,EACdC,cAAe,EACfC,YAAa,EACbC,aAAc,GAEtB,CAEO,SAASk5B,GAAQ7tB,GACpB,OAAOktB,GAASltB,EAAiB,eAAgBA,EAAgBoB,KACrE,CAEO,SAAS0sB,GAAU9tB,GACtB,OAAOktB,GAASltB,EAAiB,iBAAkBA,EAAgB3P,OACvE,CAEO,SAAS09B,GAAqB/tB,GACjC,OAAOktB,GAASltB,EAAiB,6BAA8BA,EAAgBynB,kBACnF,CAEO,SAASuG,GAAkBhuB,GAC9B,OAAOiuB,GAAajuB,GAAiB5e,MACzC,CAEO,SAAS8sC,GAAiBluB,GAC7B,OAAOmuB,GAAYnuB,GAAiB5e,MACxC,CAEO,SAAS6sC,GAAajuB,GACzB,OAAOktB,GAASltB,EAAiB,qBAAsBA,EAAgB8mB,UAC3E,CAEO,SAASqH,GAAYnuB,GACxB,OAAOktB,GAASltB,EAAiB,oBAAqBA,EAAgB6mB,SAC1E,CAUO,SAASuH,GAAcpuB,GAC1B,OAAOktB,GAASltB,EAAiB,sBAAuBA,EAAgBoB,KAAKrgB,KAAI,EAAGkhB,mBAAoBA,IAC5G,CAUO,SAASosB,GAAcruB,GAC1B,OAAOktB,GAASltB,EAAiB,sBAAuBA,EAAgB0nB,WAC5E,CAkBO,SAAS4G,GAAatuB,GACzB,OAAOktB,GAASltB,EAAiB,qBAAsBA,EAAgBgoB,UAC3E,CAMO,SAASuG,GAAkBvuB,GAC9B,OAAOktB,GAASltB,EAAiB,0BAA2BA,EAAgBuoB,eAChF,CAEO,SAASiG,GAAgBxuB,GAC5B,OAAOktB,GAASltB,EAAiB,wBAAyBA,EAAgBgM,aAC9E,CAMO,SAASyiB,GAAkBzuB,GAC9B,OAAOktB,GAASltB,EAAiB,0BAA2BA,EAAgBwoB,eAChF,CAEO,SAASkG,GAAsB1uB,GAClC,OAAOktB,GAASltB,EAAiB,8BAA+BA,EAAgByoB,mBACpF,CAUO,SAASkG,GAAU3uB,GACtB,OAAOktB,GAASltB,EAAiB,sBAAuBA,EAAgB1B,OAC5E,CAEO,SAASswB,GAAS5uB,GACrB,OAAOktB,GAASltB,EAAiB,eAAgBA,EAAgB4oB,MACrE,CChJe,MAAM12B,WAAoB8Y,IAAAA,cAErCtJ,MAAAA,GACI,MAAM,WAAEmtB,EAAU,gBAAElG,GAAoB7nC,KAAKgC,OACvC,YAAEo3B,EAAW,aAAE1lB,GAAiBm0B,EAEhCmG,EAAmB5U,EAAY7Y,QAAOhY,QAAuBzH,IAAlByH,EAAEg6B,kBAA8CzhC,IAAjByH,EAAE6sB,aAElF,OACIlL,IAAAA,cAAA,OAAK8B,UAAU,uBAEPgiB,EAAiB/tC,KAAI,EAAGsiC,cAAanN,aAAYj1B,UAAS8hC,UAAS9wB,YAAY3Q,KAC3E,MAAMytC,EAAkB,CACpB9hB,KAAMoW,GAGV,GAAIN,EACA,OACI/X,IAAAA,cAAA,OAAKzhB,IAAM,SAAQjI,IAAKwrB,UAAU,8CAA8C/lB,MAAOgoC,GACnF/jB,IAAAA,cAAA,OACI8B,UAAU,0BACV/lB,MAAO,CAAE6H,MAAOsnB,EAAYriB,OAAQg7B,MAI7C,CACH,MAAMG,EAAmB/8B,EAAWikB,EAAaja,KAAKC,IAAIga,EAAY,GAEhEhjB,EAAY,CAAC,EACnB,GAAIjS,EAAS,CACTiS,EAAU8Z,IAAM,GAAK1rB,EACrB4R,EAAU+7B,SAAW,WACrB,MAAMC,EAA2C,KAAxBjuC,GAAW,IAAIG,OACpCoT,EAAe,GAAKA,EAAe6uB,EAAc6L,EAAkB,IACnEh8B,EAAU+Z,MAAQiiB,EAAkB,EACpCh8B,EAAUi8B,UAAY,SAEtBj8B,EAAU+Z,KAAO+hB,EAAmB,CAE5C,CAEA,OACIhkB,IAAAA,cAAA,OAAKzhB,IAAM,SAAQjI,IAAKwrB,UAAU,8CAA8C/lB,MAAOgoC,GACnF/jB,IAAAA,cAAA,OACI8B,UAAU,oBACV/lB,MAAO,CAAE6H,MAAOogC,EAAkBn7B,OAAQg7B,KAE7C5tC,IAAYgR,GACT+Y,IAAAA,cAAA,OAAK8B,UAAU,kBAAkB/lB,MAAOmM,GACnCjS,GAKrB,KAKpB,EAGJiR,GAAY+Y,UAAY,CACpB0d,gBAAiB7jC,IAAAA,MAAgB,CAC7Bo1B,YAAap1B,IAAAA,QAAkBA,IAAAA,MAAgB,CAC3Cu+B,YAAav+B,IAAAA,OACboxB,WAAYpxB,IAAAA,OACZ7D,QAAS6D,IAAAA,OACTi+B,QAASj+B,IAAAA,KACTmN,SAAUnN,IAAAA,QACVtB,WACJgR,aAAc1P,IAAAA,OAAiBtB,aAEnCqrC,WAAY/pC,IAAAA,QCrEhB,SAAekmB,IAAAA,KAAWrY,IAE1B,SAASA,IAAgB,gBAAEqN,EAAe,gBAAEovB,EAAe,YAAEC,EAAW,6BAAEC,IACtE,MAAMrwB,EAASmvB,GAAcpuB,GAAiB,GACxC1B,EAASqwB,GAAU3uB,GAEzB,IAAK1B,EACD,OAAO,KAGX,MAAMixB,EAAyBD,GAAgC,CAAE9jC,IAC7D,MAAMgkC,GAAShkC,EAAMo/B,QAAUtsB,EAAOvK,aAAakZ,MAAM3O,EAAO9J,aAC1Di7B,EAAQ,GAAKjkC,EAAMs/B,QAAUxsB,EAAOvK,aAAaiZ,KAAK1O,EAAO7J,cAEnE66B,EAA6B9jC,EAAO,CAChCqG,EAAG29B,GAAOvwB,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAC9CjN,EAAGq9B,GAAOxwB,EAAO5I,KAAO4I,EAAO7I,MAAQ6I,EAAO7I,MAErD,GAED,OACI4U,IAAAA,cAAA,OAAK8B,UAAU,2BAA2Bpa,cAAe68B,GACrDvkB,IAAAA,cAAA,OAAKpc,MAAO0P,EAAO9J,aAAcX,OAAQyK,EAAO7J,eAExC26B,EAAgBruC,KAAI,CAAC8uB,EAAOppB,KACxB,MAAMipC,GAAM7f,EAAMhe,EAAIoN,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MACnDswB,EAAM,GAAK9f,EAAMzd,EAAI6M,EAAO7I,OAAO6I,EAAO5I,KAAO4I,EAAO7I,MAE9D,GAAIs5B,EAAK,GAAKA,EAAK,GAAKC,EAAK,GAAKA,EAAK,EACnC,OAAO,KAGX,MAAMprB,EAASmrB,EAAKpxB,EAAO9J,aACrBiX,EAASkkB,EAAKrxB,EAAO7J,cAErBpC,EAASwd,EAAMxd,QAAU,EACzBC,EAAYud,EAAMvd,WAAasC,EAAY,GAC3CrC,EAAcsd,EAAMtd,aAAe,QACnCC,EAAcqd,EAAMrd,aAAe,EAiCnCC,EAAUod,EAAMpd,SAAW,CAAEjH,IAC/BqkB,EAAMpd,QAAQjH,EAAOqkB,EACxB,GAEKnd,EAAgBmd,EAAMnd,eAAiB,CAAElH,IAC3CA,EAAMokC,kBACN/f,EAAMnd,cAAclH,EAAOqkB,EAC9B,GAED,OACI7E,IAAAA,cAAA,UACIzhB,IAAK9C,EACLopC,GAAItrB,EACJurB,GAAIrkB,EACJvf,EAAGmG,EACHyR,KAAMxR,EACNwM,OAAQvM,EACRC,YAAaA,EACbu9B,YAjDavkC,IAGjB,GAFAA,EAAMokC,mBAEDP,EACD,OAGJ,MAAMW,EAAUzrB,EAAS/Y,EAAMo/B,QACzBqF,EAAUxkB,EAASjgB,EAAMs/B,QAEzBoF,EAAeC,IACjB,MAAMX,GAASW,EAAUvF,QAAUoF,GAAS1xB,EAAO9J,aAC7Ci7B,EAAQ,GAAKU,EAAUrF,QAAUmF,GAAS3xB,EAAO7J,cAEvD46B,EAAY,CACR5oC,QACAopB,QACAhe,EAAG29B,GAAOvwB,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAC9CjN,EAAGq9B,GAAOxwB,EAAO5I,KAAO4I,EAAO7I,MAAQ6I,EAAO7I,MAC/C+5B,EAAU,EAGXC,EAAYA,KACdhpC,OAAOipC,oBAAoB,YAAaH,GACxC9oC,OAAOipC,oBAAoB,UAAWD,EAAU,EAGpDhpC,OAAOkpC,iBAAiB,YAAaJ,GACrC9oC,OAAOkpC,iBAAiB,UAAWF,EAAU,EAsBzC39B,QAASA,EACTC,cAAeA,GACjB,KAO9B,CAEAC,GAAgBsY,UAAY,CACxBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD4rC,gBAAiBlkB,EAAgBvY,gBAAgBnP,WACjD6rC,YAAavqC,IAAAA,KACbwqC,6BAA8BxqC,IAAAA,MC1GlC,SAAekmB,IAAAA,KAAWzX,IAE1B,SAASA,IAAc,gBAAEyM,EAAe,cAAEuwB,EAAa,aAAEC,EAAY,OAAEvxB,EAAM,aAAEzK,EAAY,cAAEC,IACzFwK,EAASA,GAAUmvB,GAAcpuB,GAAiB,GAClD,MAAM1B,EAASqwB,GAAU3uB,GAEzB,IAAK1B,EACD,OAAO,KAGX,MAAMmyB,EAAwBF,EAAclvB,QAAOqvB,KAC3CF,IAAiBE,EAAKr9B,cAItBq9B,EAAKp9B,mBAAqBk9B,KAOlC,OAAqC,IAAjCC,EAAsBrvC,OACf,KAIP4pB,IAAAA,cAAA,OAAK8B,UAAU,0BACX9B,IAAAA,cAAA,OAAKpc,MAAO4F,GAAgB8J,EAAO9J,aAAcX,OAAQY,GAAiB6J,EAAO7J,eAEzEg8B,EAAsB1vC,KAAI,CAAC2vC,EAAMjqC,KACzB+pC,GAA6C,iBAAtBE,EAAKr9B,eAC5Bq9B,EAAO,IACAA,KACAA,EAAKr9B,eAIhB,MAAMq8B,GAAMgB,EAAK7+B,EAAIoN,EAAOI,OAAOJ,EAAOG,KAAOH,EAAOI,MAExD,GAAIqwB,EAAK,GAAKA,EAAK,EACf,OAAO,KAGX,MAAMnrB,EAASmrB,GAAMl7B,GAAgB8J,EAAO9J,cAC5C,GAA8B,iBAAnBk8B,EAAKv9B,WAA0BoR,EAASmsB,EAAKv9B,UACpD,OAAO,KAGX,GAA8B,iBAAnBu9B,EAAKt9B,WAA0BmR,EAASmsB,EAAKt9B,UACpD,OAAO,KAGX,MAAMu9B,EAAY,CACd7xB,OAAQ4xB,EAAKpiC,MACbkE,YAAak+B,EAAK9hC,SACd8hC,EAAK3pC,OAAS,CAAC,GAGjBgM,EAAc,CAChB+Q,KAAM4sB,EAAKpiC,SACPoiC,EAAK39B,aAAe,CAAC,GAGvBG,EAAY,CAEV09B,SAAU,OACV9sB,KAAM4sB,EAAKpiC,MACXwQ,OAAQ,OACR+xB,WAAY,SACZC,iBAAkB,aAElBJ,EAAKx9B,WAAa,CAAC,GAG3B,IAAIL,EAAU,EACc,iBAAjB69B,EAAK79B,QACZA,EAAU69B,EAAK79B,QACR69B,EAAK19B,OACZH,EAAU,IAGd,IAAII,EAAU,EAKd,MAJ4B,iBAAjBy9B,EAAKz9B,UACZA,EAAUy9B,EAAKz9B,SAIf+X,IAAAA,cAACA,IAAAA,SAAc,CAACzhB,IAAK9C,GACjBukB,IAAAA,cAAA,QACI+lB,GAAIxsB,EACJuM,GAAIje,EACJm+B,GAAIzsB,EACJyM,GAAKvc,GAAiB6J,EAAO7J,cAC7B1N,MAAO4pC,IAIPD,EAAK59B,SACLkY,IAAAA,cAAA,WACIimB,OAAS,GAAE1sB,EAAS,OAAOA,EAAS,OAAOA,MAC3Cxd,MAAOgM,IAKX29B,EAAK19B,MACLgY,IAAAA,cAAA,QACInZ,EAAG0S,EACHnS,EAAGa,EACHlM,MAAOmM,GAENw9B,EAAK19B,MAGD,KAO7C,C,uOAEAO,GAAc0X,UAAY,CACtBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD+sC,cAAerlB,EAAgB3X,cAAc/P,WAC7CgtC,aAAc1rC,IAAAA,KACdma,OAAQna,IAAAA,OACR0P,aAAc1P,IAAAA,OACd2P,cAAe3P,IAAAA,QCnHnB,SAAekmB,IAAAA,KAAWkmB,IAE1B,SAASA,IAAU,gBAAElxB,EAAe,MAAEE,EAAK,WAAE2uB,EAAU,uBAAEsC,EAAsB,aAAEC,EAAY,eAAEC,EAAc,kBAAElxB,EAAiB,gBAAEivB,EAAe,YAAEC,EAAW,6BAAEC,EAA4B,cAAEiB,EAAa,WAAEhoB,EAAU,SAAE1B,EAAQ,aAAEyqB,IAC/N,MAAMC,GAAWC,EAAAA,EAAAA,cAAaC,IAK1B,GAJIzxB,EAAgB2a,iBAChB3a,EAAgB2a,gBAAgBxgB,WAG/Bs3B,EACD,OAGJ,MAAMzI,EAAW,IAAIjpB,EAAkB,CACnCC,gBAAiBA,EACjBC,cAAewxB,EACfvxB,QACAC,sBAGJH,EAAgB2a,gBAAkBqO,EAClCA,EAAS/nB,QAAQ,GAClB,CAACf,EAAOF,KAGJ0xB,EAAiBC,IAAsBnE,EAAAA,EAAAA,UAAS,CACnD9f,SAAS,EACTkkB,MAAO,CAAC,EACR7qC,MAAO,CAAC,IAGN2gC,EAAa2G,GAAcruB,GAE3BmM,EAAY0hB,GAAQ7tB,GAAiB5e,OAErCoqB,EJ0CH,SAAyBxL,GAC5B,OAAOktB,GAASltB,EAAiB,wBAAyBA,EAAgB8nB,aAC9E,CI5CoB+J,CAAgB7xB,GAC1BgM,EAAewiB,GAAgBxuB,GAC/B8xB,EAAkBpD,GAAsB1uB,GACxC2oB,EJ+EH,SAA4B3oB,GAC/B,OAAOktB,GAASltB,EAAiB,sBAAuBA,EAAgB2oB,gBAC5E,CIjF4BoJ,CAAmB/xB,GACrCyN,EJ0CH,SAAwBzN,GAC3B,OAAOktB,GAASltB,EAAiB,gCAAiCA,EAAgB+nB,iBACtF,CI5CwBiK,CAAehyB,GAoLnC,OAnGAytB,EAAAA,EAAAA,YAAU,KACN,MAAMwE,EAAWA,KACRb,GAILpxB,EAAgB0qB,qBAAqB,EAGnCwH,EAAqB1mC,IAClB4lC,GAILpxB,EAAgB2qB,wBAAwB,CACpCC,QAASp/B,EAAMo/B,QACfE,QAASt/B,EAAMs/B,QACfE,SAAUx/B,EAAMw/B,UAClB,EAMN,OAHA5jC,OAAOkpC,iBAAiB,SAAU2B,EAAU,CAAEE,SAAS,IACvD/qC,OAAOkpC,iBAAiB,YAAa4B,EAAmB,CAAEC,SAAS,IAE5D,KACH/qC,OAAOipC,oBAAoB,SAAU4B,GACrC7qC,OAAOipC,oBAAoB,YAAa6B,EAAkB,CAC7D,GACF,IAwEClnB,IAAAA,cAAA,OAAK8B,UAAU,gCACVojB,YA1HY1kC,IACjB,GAAIkmC,EAAgBhkB,QAAS,CACzB,MAAM3Z,EAAeiM,EAAgB2a,gBAAgB5mB,aAC/ClC,EAAIrG,EAAMo/B,QAAU72B,EAAakZ,KACjC7a,EAAI5G,EAAMs/B,QAAU/2B,EAAaiZ,IAEvC2kB,GAAmB,EAAGC,YACX,CACHlkB,SAAS,EACTkkB,QACA7qC,MAAO,CACHkmB,KAAMhR,KAAKqI,IAAIzS,EAAG+/B,EAAM//B,GACxBmb,IAAK0a,EAAa,EAAIzrB,KAAKqI,IAAIlS,EAAGw/B,EAAMx/B,GACxCxD,MAAOqN,KAAKgK,IAAIpU,EAAI+/B,EAAM//B,GAC1BgC,OAAQ6zB,EAAa3zB,EAAaF,OAASoI,KAAKgK,IAAI7T,EAAIw/B,EAAMx/B,OAI9E,GAyGKggC,aAxEYA,KACjBpyB,EAAgBwrB,4BAA4B,CACxC9d,SAAS,GACX,EAsEGqiB,YAtLYvkC,IACjB,IAAK2lC,EACD,OAGJ,IAAIkB,EAAc7mC,EAAMxE,OACxB,IAAK,IAAI1F,EAAI,EAAGA,EAAI,IAAM+wC,EAAa/wC,IAAK,CACxC,GAAI+wC,EAAYC,UAAUC,SAAS,mBAC/B,OAEJF,EAAcA,EAAYjqC,UAC9B,CAEA,MAAM2L,EAAeiM,EAAgB2a,gBAAgB5mB,aAE/C69B,EAAQ,CACV//B,EAAGrG,EAAMo/B,QAAU72B,EAAakZ,KAChC7a,EAAG5G,EAAMs/B,QAAU/2B,EAAaiZ,KAIpC2kB,EAAmB,CACfjkB,SAAS,EACTkkB,QACA7qC,MAAO,CACHkmB,KAAM2kB,EAAM//B,EACZmb,IAAK4kB,EAAMx/B,EACXxD,MAAO,EACPiF,OAAQ,KAIhB,MAAMu8B,EAAa5kC,IAGf,GAFApE,OAAOipC,oBAAoB,UAAWD,IAEjCe,EACD,OAGJ,MAAMt/B,EAAIrG,EAAMo/B,QAAU72B,EAAakZ,KACjC7a,EAAI5G,EAAMs/B,QAAU/2B,EAAaiZ,IAEvChN,EAAgB+pB,uBAAuB,CACnC52B,UAAW8I,KAAKqI,IAAIzS,EAAG+/B,EAAM//B,GAC7BuB,UAAW6I,KAAKC,IAAIrK,EAAG+/B,EAAM//B,GAC7Bo4B,UAAWhuB,KAAKqI,IAAIlS,EAAGw/B,EAAMx/B,GAC7B83B,UAAWjuB,KAAKC,IAAI9J,EAAGw/B,EAAMx/B,KAGjCu/B,EAAmB,CACfjkB,SAAS,EACT3mB,MAAO,CAAC,GACV,EAGNK,OAAOkpC,iBAAiB,UAAWF,EAAU,EAgIxC39B,QApEQjH,IAMb,GALAwU,EAAgB0rB,cAAc,CAC1Bd,QAASp/B,EAAMo/B,QACfE,QAASt/B,EAAMs/B,UAGfuG,GAAkBA,EAAe7/B,eACjCwO,EAAgBisB,0BAepB,GAVKzgC,EAAMxE,OAAOwrC,QAAQ,0BACtBxyB,EAAgBwrB,4BAA4B,CACxC9d,SAAS,IAIZtmB,OAAOymB,cAA+C,UAA/BzmB,OAAOymB,eAAe5hB,MAC9C+T,EAAgB2rB,qBAGhB2F,EAAc,CACd,MAAMmB,EAAuB,CAAC,EAExBpiC,EAAS2P,EAAgB3P,OAC/B,IAAK,IAAI/O,EAAI,EAAGA,EAAI+O,EAAOjP,OAAQE,IAAK,CACpC,MAAMqgB,EAAetR,EAAO/O,GAEtBgd,EAAS0B,EAAgB1B,OACzBW,EAAS0C,EAAa7S,KAAKmT,cAE3Bsf,EAAQvhB,EAAgB8nB,aAAa3a,OAAO7O,EAAO9J,cAAgByK,EAAOG,KAAOH,EAAOI,MAAQJ,EAAOI,KAE7G,IAAI9c,EAAOof,EAAaQ,YACpBR,EAAalT,wBACblM,EAAOA,EAAK8e,QAAQqB,GAA8B,iBAAbA,EAAM,MAG/C,MACM+e,EAAel/B,EADA4vB,GAAa5vB,EAAMg/B,EAAO,CAAEjP,aAAa,KAG9DmgB,EAAqB9wB,EAAare,MAAQm+B,EAAa,EAC3D,CAIA6P,EAAa9lC,EAAOinC,EACxB,GAqBK//B,cAnBaA,KAClBsN,EAAgBisB,oBAAoB,EAmB/ByG,cAhBclnC,IACnBA,EAAMmnC,iBACN3yB,EAAgBwrB,4BAA4B,CACxCZ,QAASp/B,EAAMo/B,QACfE,QAASt/B,EAAMs/B,QACfpd,SAAS,GACX,EAWG3mB,MAA6B,iBAAf8nC,EAA0B,CAAEh7B,OAAQg7B,QAAejtC,GAElEopB,IAAAA,cAAA,UAAQuC,IAAKgkB,IAGTH,GACApmB,IAAAA,cAACG,GAAO4B,GAAA,CACJZ,UAAWA,EACXH,aAAcA,EACdzD,WAAYA,EACZ1B,SAAUA,GACLwqB,GAAkB,CAAC,EACpB7lB,IAKRiC,EAAYC,SACZ1C,IAAAA,cAACqC,GAAW,CACRI,YAAaA,IAKjBqkB,GACA9mB,IAAAA,cAAC9Y,GAAW,CACR28B,WAAYA,GAAc7uB,GAAiB2a,iBAAiB5mB,cAAcF,OAC1E80B,gBAAiBA,IAKrB4H,GACAvlB,IAAAA,cAACzX,GAAa,CACVyM,gBAAiBA,EACjBuwB,cAAeA,IAKnBnB,GACApkB,IAAAA,cAACrY,GAAe,CACZqN,gBAAiBA,EACjBovB,gBAAiBA,EACjBC,YAAaA,EACbC,6BAA8BA,IAKlC6B,GAA0BO,EAAgBhkB,SAC1C1C,IAAAA,cAAA,OAAK8B,UAAU,mBACV/lB,MAAO2qC,EAAgB3qC,QAK5C,CAEAmqC,GAAUjmB,UAAY,CAClBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD0c,MAAOpb,IAAAA,KACPqb,kBAAmBrb,IAAAA,KACnB+pC,WAAY/pC,IAAAA,OACZqsC,uBAAwBrsC,IAAAA,KAAetB,WACvC4tC,aAActsC,IAAAA,KAAetB,WAC7B6tC,eAAgBnmB,EAAgBvZ,eAChC4+B,cAAerlB,EAAgB3X,cAC/B67B,gBAAiBlkB,EAAgBvY,gBACjC08B,YAAavqC,IAAAA,KACbwqC,6BAA8BxqC,IAAAA,KAC9BwsC,aAAcxsC,IAAAA,KACdyjB,WAAYzjB,IAAAA,MAAgB,CAAC,MAAO,QACpC+hB,SAAU/hB,IAAAA,Q,0ICrTVM,GAAU,CAAC,ECTf,SAASwtC,GAAUC,GAAW,MAACtiC,EAAK,IAAE+T,EAAG,IAAEpI,EAAG,SAAE42B,EAAQ,UAAEC,EAAS,UAAE5sB,EAAS,UAAE6sB,EAAS,MAAE7qB,EAAK,SAAEC,EAAQ,SAAEC,EAAQ,cAAE4qB,EAAc,CAAC,GAAKC,EAAK,CAAC,GAC5I,IAAIC,EAAcN,EAEJ,QAAVtiC,IACA4iC,EAAc,IAAIN,GAGtB,IAAIze,GAAWye,EAAYvuB,IAAMpI,EAAMoI,GACnCwuB,IACA1e,EAAU,EAAMA,GAGpB,IAAIgf,EAAahf,EAAU2e,EAK3B,OAJI3sB,MAAMgtB,KACNA,EAAa,GAGV,CACHA,aACAP,UAAWM,EACX3iC,MAAOwiC,EAAUG,EAAa,IAAKF,EAAe9sB,YAAWqE,IAAe,QAAVja,EAAiB4X,QAAOC,WAAUC,aACpG/K,KAAM,WACH41B,EAEX,CAEA,SAASG,GAAiBD,GAAY,MAAC7iC,EAAK,IAAE+T,EAAG,IAAEpI,EAAG,SAAE42B,EAAQ,UAAEC,EAAS,UAAE5sB,EAAS,UAAE6sB,EAAS,MAAE7qB,EAAK,SAAEC,EAAQ,SAAEC,EAAQ,cAAE4qB,EAAc,CAAC,GAAKC,EAAK,CAAC,GACpJ,IAAI9e,EAAUgf,EAAWL,EACrBD,IACA1e,EAAU,EAAMA,GAGpB,IAAIye,EAAYze,GAAWlY,EAAMoI,GAAOA,EAMxC,MAJc,QAAV/T,IACAsiC,EAAY52B,KAAKkuB,IAAI,GAAI0I,IAGtB,CACHO,aACAP,YACAriC,MAAOwiC,EAAUH,EAAW,IAAKI,EAAe9sB,YAAWqE,IAAe,QAAVja,EAAiB4X,QAAOC,WAAUC,aAClG/K,KAAM,WACH41B,EAEX,CAiBA,SAASI,GAAejnC,EAAOknC,GAC3B,GAAIlnC,GAAS,EACT,OAAO,EAGX,GAAgB,IAAZknC,EACA,OAAOt3B,KAAKqO,MAAMje,GAGtB,GAAIA,GAASknC,EACT,OAAOt3B,KAAKqO,MAAMje,EAAMknC,GAASA,EAGrC,IAAIC,EACJ,GAAgB,KAAZD,EACAC,EAAW,CAAC,EAAG,EAAG,EAAG,GAAI,QACtB,IAAgB,KAAZD,EAGP,MAAM,IAAIlwC,MAAM,mBAFhBmwC,EAAW,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAGrC,CAEA,IAAIC,EAAYnS,IACZoS,EAAc,EAClB,IAAK,IAAIpyC,EAAI,EAAGA,EAAIkyC,EAASpyC,OAAQE,IAAK,CACtC,MAAMqyC,EAAQ13B,KAAKgK,IAAIutB,EAASlyC,GAAK+K,GACjCsnC,EAAQF,IACRC,EAAcF,EAASlyC,GACvBmyC,EAAYE,EAEpB,CAEA,OAAOD,CACX,CAyJe,SAASE,GAAUV,GAC9B,OAAIA,EAAK/qB,MA9Eb,UAAwB,IAAE7D,EAAG,IAAEpI,EAAG,UAAEiK,EAAS,kBAAE0tB,EAAiB,aAAEC,EAAY,UAAEf,EAAS,UAAEgB,GAAU,EAAK,SAAEC,GAAS,EAAK,MAAEzjC,EAAM,SAAQ,UAAEyiC,EAAS,SAAEF,GAAS,EAAK,cAAEG,IACnK,MAAMgB,EAAkBJ,EAAoB,EAAEC,EAExCI,EAAQ,GACRC,EAAkB,CAAC5jC,QAAO+T,MAAKpI,MAAK42B,WAAUC,YAAW5sB,YAAW6sB,YAAWC,gBAAe9qB,OAAO,IAErG,OAAEisB,EAAM,KAAEC,GAhFpB,SAAgCC,EAAMC,EAAc/rB,GAChD,MAAMgsB,EAAUF,EAAOC,EAEvB,OAAIC,EAAU,OAAahsB,GAAiC,WAAjBA,GAChC,CACH4rB,OAAQd,GAAekB,EAAQ,IAAM,IACrCH,KAAM,KAIVG,EAAU,QAAgBhsB,GAAiC,WAAjBA,GACnC,CACH4rB,OAAQd,GAAekB,EAAO,IAAY,IAC1CH,KAAM,KAIVG,EAAU,SAAmBhsB,GAAiC,SAAjBA,GACtC,CACH4rB,OAAQd,GAAekB,EAAO,KAAe,IAC7CH,KAAM,KAIO,QAAjB7rB,GAA2BgsB,EAAU,SAAqBhsB,EACnD,CACH4rB,OAAQd,GAAekB,EAAO,MAAkB,GAChDH,KAAM,KAIVG,EAAU,UAAsBhsB,GAAiC,UAAjBA,GACzC,CACH4rB,OAAQd,GAAekB,EAAQ,GAAG,GAAG,GAAG,GAAG,IAAM,GACjDH,KAAM,SAIO,SAAjB7rB,EACO,CACH4rB,OAAQd,GAAekB,EAAQ,IAAI,GAAG,GAAG,GAAG,IAAM,GAClDH,KAAM,QAIP,CACHA,KAAM,IACND,OAAQ,GAEhB,CA+B6BK,CAAuBv4B,EAAMoI,EAAKyuB,EAAUkB,EAAiBhB,EAAczqB,cAE9FH,EAAoB,UAATgsB,EAEZN,GACDG,EAAM3zC,KAAK8yC,GAAiB,EAAG,IAAIc,EAAiB9rB,YAAW,CAAC4mB,SAAU,WAG9E,IAAIyF,EAAc,IAAI5iC,KAAKwS,GAEd,MAAT+vB,EACAK,EAAYC,WAAW,EAAG,EAAG,GACb,MAATN,EACPK,EAAYE,WAAW,EAAG,GACV,MAATP,EACPK,EAAYG,gBAAgB,GACZ,UAATR,GACPK,EAAchtB,GAAqBgtB,EAAazB,EAAcpsB,UAC9D6tB,EAAYI,QAAQ,IACJ,MAATT,IACPK,EAAchtB,GAAqBgtB,EAAazB,EAAcpsB,WAGlE,IAAIkuB,EAAiB/B,EAAU0B,EAAa,IAAIzB,KAAkBkB,EAAiB9rB,UAAU,IAC7F,KAAOqsB,EAAcx4B,GAAK,CACtB,IAAIy3B,EAAQ,MAEC,MAATU,EACAV,EAAmD,IAA1CS,EAASM,EAAYhrB,WAAa0qB,GAAW,GAAG,IACzC,MAATC,EACPV,EAAqD,IAA5CS,EAASM,EAAY9qB,aAAewqB,GAAW,IACxC,MAATC,EACPV,EAAqD,KAA5CS,EAASM,EAAY3qB,aAAeqqB,GAC7B,UAATC,GACPV,EAAQ,EAEJe,EAD2B,KAA3BA,EAAYtrB,WACE,IAAItX,KAAK4iC,EAAYzrB,cAAgB,EAAG,EAAG,GAE3C,IAAInX,KAAK4iC,EAAYzrB,cAAeyrB,EAAYtrB,WAAa,EAAG,IAElE,SAATirB,IACPK,EAAc,IAAI5iC,KAAK4iC,EAAYzrB,cAAgB,EAAG,EAAG,IAG7DyrB,EAAc,IAAI5iC,KAAK4iC,EAAYzsB,UAAY0rB,GAE/C,MAAMvrB,EAAW4qB,EAAU0B,EAAa,IAAIzB,KAAkBkB,EAAiB9rB,UAAU,MAAY0sB,EAE/FC,EAAOpC,GAAU8B,EAAa,IAAIP,EAAiB/rB,WAAUC,aAE/D6rB,EAAM9yC,QAAW4zC,EAAK5B,WAAac,EAAMA,EAAM9yC,OAAS,GAAGgyC,WAAeS,GAAqBC,GAAgB,IAI/GkB,EAAK5B,WAAaS,EAAkB,GAAKd,IAI7CmB,EAAM3zC,KAAKy0C,GACXD,EAAiB/B,EAAU0B,EAAa,IAAIzB,KAAkBkB,EAAiB9rB,UAAU,IAC7F,CAEA,MAAMD,EAAW2sB,IAAmB/B,EAAU92B,EAAK,IAAI+2B,KAAkBkB,EAAiB9rB,UAAU,IAMpG,OAJK2rB,GAAYE,EAAMA,EAAM9yC,OAAS,GAAGgyC,WAAaS,EAAoBd,GACtEmB,EAAM3zC,KAAK8yC,GAAiBN,EAAW,IAAIoB,EAAiB/rB,WAAUC,YAAW,CAAC4mB,SAAU,UAGzFiF,EAAM7yB,QAAO,EAAG+xB,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CAIe6B,CAAe/B,GAtG9B,UAA0B,IAAE5uB,EAAG,IAAEpI,EAAG,UAAEiK,EAAS,kBAAE0tB,EAAiB,aAAEC,EAAY,UAAEf,EAAS,MAAExiC,EAAM,SAAQ,UAAEyiC,EAAS,SAAEF,GAAS,EAAK,cAAEG,IACpI,MAAMgB,EAAkBJ,EAAoB,EAAEC,EAExCI,EAAQ,GACRC,EAAkB,CAAC5jC,QAAO+T,MAAKpI,MAAK42B,WAAUC,YAAW5sB,YAAW6sB,YAAWC,gBAAe9qB,OAAO,GAGrG+sB,EAxGV,SAA4BZ,EAAMC,GAC9B,MAAMC,EAAUF,EAAKC,EAEfpuB,EAA6C,EAAhClK,KAAK+J,MAAM/J,KAAKgK,IAAIuuB,IACjC7oB,EAAcxF,EAAYlK,KAAKoV,MAAMlL,GAAc,GAAM,EAAI,EAE7DgvB,EAAU,IAAIl5B,KAAKoV,MAAMlL,GAAawF,EAE5C,OAAO1P,KAAKqO,MAAMkqB,EAAUW,GAASA,CACzC,CA+FwBC,CAAmBl5B,EAAMoI,EAD1BrI,KAAKoV,OAAO0hB,EAA8B,EAAlBc,GAAqBI,IAEhE,GAAIiB,EAAc,EACd,IAAK,IAAI7oC,EA9GjB,SAA2BA,EAAO6oC,GAC9B,OAAOj5B,KAAKqO,MAAMje,EAAM6oC,GAAaA,CACzC,CA4GyBG,CAAkB/wB,EAAK4wB,GAAc7oC,EAAQ6P,EAAK7P,GAAS6oC,EACxEhB,EAAM3zC,KAAKqyC,GAAUvmC,EAAO8nC,IAUpC,OANID,EAAM9yC,QACF0xC,GAAYoB,EAAMA,EAAM9yC,OAAS,GAAGgyC,WAAaU,GACjDI,EAAM3zC,KAAK8yC,GAAiBQ,EAAoB,EAAGM,IAIpDD,EAAM7yB,QAAO,EAAG+xB,gBAAiBA,GAAcL,GAAaK,GAAc,GACrF,CAmFekC,CAAiBpC,EAEhC,CDnPA9tC,GAAQ8C,kBAAoB,KAC5B9C,GAAQwC,cAAgB,KAElBxC,GAAQ0B,OAAS,UAAc,KAAM,QAE3C1B,GAAQe,OAAS,KACjBf,GAAQ6C,mBAAqB,KAEhB,KAAI,KAAS7C,IAKJ,MAAW,KAAQmwC,QAAS,KAAQA,OEnB1D,SAAevqB,IAAAA,KAAWwqB,IAE1B,SAASA,IAAM,SAAEC,EAAQ,SAAEC,EAAQ,gBAAE11B,EAAe,UAAE21B,EAAS,UAAEC,EAAS,WAAErtB,EAAU,SAAE1B,EAAQ,aAAE4B,EAAY,iBAAEotB,IAC5G,IAAKJ,IAAaC,EACd,OAAO,KAGX,MAAM,aAAElhC,EAAY,cAAEC,GAAkBm5B,GAAe5tB,IACjD,KAACX,EAAI,KAAED,EAAI,MAAE+I,GPkDhB,SAAsBnI,GACzB,OAAOktB,GAASltB,EAAiB,oBAAqBA,EAAgB4N,UAC1E,COpDgCkoB,CAAa91B,GACnCkiB,EPyIH,SAAqBliB,GACxB,OAAOktB,GAASltB,EAAiB,oBAAqBA,EAAgBkiB,SAC1E,CO3IqB6T,CAAY/1B,GACvB+oB,EP4IH,SAAoB/oB,GACvB,OAAOktB,GAASltB,EAAiB,kBAAmBA,EAAgB+oB,QACxE,CO9IoBiN,CAAWh2B,GAE3B,IAAImG,EAEAA,EADAgC,EjChBD,SAAgC8tB,EAASC,GAC5CD,EAAU,IAAInkC,KAAKmkC,GAGnB,MAAM5xB,GAFN6xB,EAAU,IAAIpkC,KAAKokC,IAEGjuB,UAAYguB,EAAQhuB,UAC1C,OAAI5D,EAAQ,IACD,KACAA,EAAQ,IACR,IAEA,GAEf,CiCKoB8xB,CAAuB92B,EAAMD,GAE7B2G,EAAmB3G,EAAOC,GAG1C,IAAIqJ,EAAiB,KACrB,GAAIwZ,EAAU,CACVxZ,EAAiB,CAAC,EAClB,IAAK,MAAOnf,EAAK8C,KAAU5C,OAAO8b,QAAQwjB,GACtCrgB,EAAerc,GAAS9C,CAEhC,CAEA,MAAM0pC,EAAgB,CAClBzqB,aAAcotB,EACdrtB,aACA1B,WACA4B,eACAC,iBACAsqB,UAAW6C,GAGTO,EAAWluB,GAAQ7I,EAAM,IAAI4zB,EAAe9qB,QAAOhC,cAAatlB,WAChEw1C,EAAWnuB,GAAQ9I,EAAM,IAAI6zB,EAAe9qB,QAAOhC,cAAatlB,WAEtE,IAAIy1C,EAAkE,EAA7Cr6B,KAAKC,IAAIk6B,EAASh1C,OAAQi1C,EAASj1C,QACxDu0C,IACAW,GAAsB,GAG1B,MAEMpC,EAAQN,GAAU,CACpBtvB,IAAKjF,EACLnD,IAAKkD,EACL2zB,UAAWv+B,EACX2R,YACAgC,QACA6qB,UAAW6C,GAAoB3tB,GAC/B2rB,kBAAmByC,EACnBxC,aAViB,GAWjBb,kBAKJ,OACIjoB,IAAAA,cAAA,OAAK8B,UAAU,cAAc/lB,MAAO0uC,OAAW7zC,EAAY,CAAC20C,cAAe,KAEnEd,GACAzqB,IAAAA,cAAA,QAAM5hB,EAAI,UAASoL,IAAgBsY,UAAU,cAG7C2oB,GACAzqB,IAAAA,cAAA,QAAM5hB,EAAI,UAASoL,EAAe,IAAKsY,UAAU,qBAIjDonB,EAAMnzC,KAAI,EAAGqyC,aAAY5iC,QAAO8M,OAAM2xB,WAAUuH,YAAYl1C,KACxD,GAAI8kB,MAAMgtB,GACN,OAAO,KAGX,MAAMqD,EAAU,CAAC,YAAc,aAAYn5B,IAAS,aAAY2xB,KAKhE,OAJI0G,GACAc,EAAQl2C,KAAK,wBAIbyqB,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwrB,UAAW2pB,EAAQp1C,KAAK,MAE3Bo0C,GACAzqB,IAAAA,cAAA,QAAM5hB,EAAI,IAAGgqC,SAAmBtmB,UAAU,cAI1C4oB,IAAac,GACbxrB,IAAAA,cAAA,QAAM5hB,EAAI,IAAGgqC,SAAkB3+B,MAI/BghC,GACAzqB,IAAAA,cAAA,QAAMnZ,EAAGuhC,EAAYhhC,EAAGskC,IACnBlmC,GAGT,IAM5B,CAEAglC,GAAMvqB,UAAY,CACdjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvDiyC,SAAU3wC,IAAAA,KAAetB,WACzBkyC,SAAU5wC,IAAAA,KAAetB,WACzBmyC,UAAW7wC,IAAAA,KACX8wC,UAAW9wC,IAAAA,MAAgB,CAAC,SAC5ByjB,WAAYzjB,IAAAA,MAAgB,CAAC,MAAO,QACpC+hB,SAAU/hB,IAAAA,OACV2jB,aAAc3jB,IAAAA,KACd+wC,iBAAkB/wC,IAAAA,MCjHtB,SAAekmB,IAAAA,KAAW2rB,IAE1B,SAASA,IAAM,gBAAE32B,EAAe,SAAEy1B,EAAQ,SAAEC,EAAQ,cAAEkB,EAAa,KAAE9nC,EAAI,UAAE+nC,EAAS,WAAEhI,EAAU,MAAEjG,EAAK,UAAEvQ,EAAS,oBAAEye,EAAoB,EAAC,UAAEnB,EAAS,eAAEoB,IAClJ,IAAKtB,IAAaC,EACd,OAAO,KAGX,MAAM,KAAEplC,EAAI,MAAEC,EAAK,UAAEH,EAAS,MAAEI,GAAUq9B,GAAQ7tB,GAAiBlR,EAAKsB,YAElE,aAAEoE,EAAY,cAAEC,GAAkBm5B,GAAe5tB,GACvD,IAAI,KAAE5J,EAAI,KAAEC,GAAS+3B,GAAcpuB,GAAiB5P,GAEpD,MAAMskB,EAAeL,GAAY,CAAEje,OAAMC,OAAM9F,UAC/C6F,EAAOse,EAAate,KACpBC,EAAOqe,EAAare,KAEpB,MAAM69B,EAAQN,GAAU,CACpBtvB,IAAKlO,EACL8F,IAAK7F,EACL08B,UAAWt+B,EACXlE,QACA4V,UAAWJ,EAAmB1P,EAAOD,GACrC48B,UAAWzoB,GACXuoB,UAAU,EACVe,kBAAmB8B,EAAY,GAAK,GACpC7B,aAAc,KAMlB,IAAIkD,EAAc,EAEJ,QAAVzmC,IACAymC,EAAc,GAGlB,MAAMvP,EAAoBsG,GAAqB/tB,IAExCosB,EAAe6K,IAAoBzJ,EAAAA,EAAAA,UAAS,OAC5C0J,EAAWC,IAAgB3J,EAAAA,EAAAA,UAAS,CAAE4J,GAAI,EAAGC,GAAI,IA8ClDC,EAA+B,QAAV1O,EAAkB,EAAM,GAC7C2O,EAAiC,QAAV3O,EAAkB,GAAM,GAErD,OACI5d,IAAAA,cAAA,OAAK8B,UAAY,sBAAqBxc,IACjC,kBAAiBF,EACjB,kBAAiBioB,EACjBtxB,MAAO,CACH6H,MAAO6b,GACP+sB,WAAY/B,OAAW7zC,GAAY,GACnCiS,OAA8B,iBAAfg7B,EAA0BA,OAAajtC,IAIvD6zC,GACAsB,GACAjoC,EAAKuB,OAAOtP,KAAI,CAAC4gB,EAAcrgB,KAC3B,MAAMuS,EAASY,EAAc3F,EAAKuB,OAAOjP,OAEzC,OACI4pB,IAAAA,cAAA,QACInZ,EAAY,SAATvB,EAAkB,EAAI,EACzB8B,EAAG9Q,EAAEuS,EACLjF,MAAO6b,GACP5W,OAAQA,EACRtK,IAAKoY,EAAalb,MAClBqd,KAAMjP,EAAS8M,EAAarT,MAAOqT,EAAalb,MAAOkb,EAAa5M,yBACpE0iC,QAAS91B,EAAalb,QAAUghC,EAAoB6P,EAAqBC,EACzE,sBAAqB9iC,EACrB,qBAAoB3F,EAAKuB,OAAOjP,QAClC,IAMVq0C,GACAzqB,IAAAA,cAAA,QAAM5hB,EAAI,IAAY,SAATkH,EAAkBma,GAAiB,QAAQhW,IAAiBqY,UAAU,cAInF2oB,GACAzqB,IAAAA,cAAA,QAAM5hB,EAAI,IAAY,SAATkH,EAAkBma,GAAiB,QAAQhW,EAAgB,IAAKqY,UAAU,qBAIvFonB,EAAMnzC,KAAI,EAAGqyC,aAAY5iC,QAAO8M,OAAMk5B,YAAYl1C,KAC9C,MAAMo2C,EAAgB,SAATpnC,GAAmBumC,EAAY,GAAKpsB,IAAgBosB,EAAUpsB,GACrErpB,GAAmB,SAATkP,EAAkB,GAAM,IAAMkE,EAAa,GAErDiiC,EAAU,CAAC,YAAc,aAAYn5B,KAK3C,OAJIq4B,GACAc,EAAQl2C,KAAK,wBAIbyqB,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwrB,UAAW2pB,EAAQp1C,KAAK,MAE3Bq0C,IACCc,GACDxrB,IAAAA,cAAA,QAAM5hB,EAAI,IAAGsuC,KAAQtE,MAAehyC,MAIpCs0C,IACCc,GACDK,EAAY,GACZ7rB,IAAAA,cAAA,QACI5hB,EAAI,IAAY,SAATkH,EAAkBma,GAAe,KAAK2oB,OAAyB,SAAT9iC,EAAkB,GAAK,GAAKumC,EAAYpsB,KACrGktB,gBAAiB,QAKrBlC,GACAzqB,IAAAA,cAAA,QAAMnZ,EAAY,SAATvB,EAAkBma,GAAausB,EAAcA,EAAa5kC,EAAGghC,GACjE5iC,GAGT,IAMZomC,GAAiBnB,GACjB3mC,EAAKuB,OAAOtP,KAAI,CAAC4gB,EAAcrgB,KAE3B,IAAIuQ,EAAK4Y,GAA2D,IAATnpB,EAAI,EAAI,GAC/D8Q,GAAK,GAAmC6J,KAAKsK,KAAKzX,EAAKuB,OAAOjP,OAAS,GAAK,GAAmC6a,KAAKoV,MAAM/vB,EAAI,GAOlI,OALIqgB,IAAiByqB,IACjBv6B,GAAKqlC,EAAUE,GACfhlC,GAAK8kC,EAAUG,GAAKP,GAIpB9rB,IAAAA,cAAA,QACI8B,UAAU,mBACVijB,YAAcvkC,GA/IpBosC,EAACpsC,EAAOmW,KACtB,IAAI5P,EAASvG,EAAMo/B,QACfiN,EAASrsC,EAAMs/B,QAEN,SAATx6B,IACAyB,GAAU0Y,IAGD,UAATna,IACAyB,GAAU0Y,IAGd0sB,EAAa,CACTC,GAAI,EACJC,GAAI,IAGR,MAAMnH,EAAeC,IACjBgH,EAAa,CACTC,GAAIjH,EAAUvF,QAAU74B,EACxBslC,GAAIlH,EAAUrF,QAAU+M,GAC1B,EAGAzH,EAAa0H,IACf1wC,OAAOipC,oBAAoB,YAAaH,GACxC9oC,OAAOipC,oBAAoB,UAAWD,GAEtC,IAAIppC,EAAS8wC,EAAa9wC,OAC1B,KAAOA,KAAYA,EAAO+wC,SAAW,CAAC,GAAG3nC,WACrCpJ,EAASA,EAAOoB,WAGpB6uC,EAAiB,MACjBj3B,EAAgBmsB,aAAaxqB,EAAc3a,IAAWA,EAAO+wC,SAAW,CAAC,GAAG3nC,UAAWpJ,IAAWA,EAAO+wC,SAAW,CAAC,GAAGC,UAAU,EAGtI5wC,OAAOkpC,iBAAiB,YAAaJ,GACrC9oC,OAAOkpC,iBAAiB,UAAWF,GAEnC6G,EAAiBt1B,GACjB3B,EAAgBksB,eAAe,EAsGa0L,CAAUpsC,EAAOmW,GACzC9P,EAAGA,EACHO,EAAGA,EACHxD,MAhKH,GAiKGiF,OAjKH,GAkKGtK,IAAKoY,EAAalb,MAClBqd,KAAMjP,EAAS8M,EAAarT,MAAOqT,EAAalb,MAAOkb,EAAa5M,yBACpEkjC,YAAaA,IAAMj4B,EAAgB2pB,qBAAqBhoB,EAAalb,OACrEyxC,WAAYA,IAAMl4B,EAAgB2pB,qBAAqB,OACzD,IAMV8L,KAAcjlC,GACdwa,IAAAA,cAAA,QACI8B,UAAY,gBAAc6oB,EAAY,oBAAsB,IAC5D9jC,EAAY,SAATvB,EAAkB,GAAKma,GAC1BrY,EAAGqC,EAAc,GAAc,SAATnE,GAAmB,EAAI,IAAIF,EAAY,IAAIulC,EjCtN9C,GiCsNoF,GACvG7pB,UAAY,UAAkB,SAATxb,GAAmB,GAAK,OAAgB,SAATA,EAAkB,GAAKma,OAAsBhW,EAAc,MAE9GjE,GAKrB,CAEAmmC,GAAM1rB,UAAY,CACdjL,gBAAiBlb,IAAAA,WAAqB8yB,IACtC6d,SAAU3wC,IAAAA,KAAetB,WACzBkyC,SAAU5wC,IAAAA,KAAetB,WACzBuzC,eAAgBjyC,IAAAA,KAAetB,WAC/BozC,cAAe9xC,IAAAA,KAAetB,WAC9BsL,KAAMoc,EAAgB/a,KAAK3M,WAC3BqzC,UAAW/xC,IAAAA,OAAiBtB,WAC5BqrC,WAAY/pC,IAAAA,OACZ8jC,MAAO9jC,IAAAA,OACPuzB,UAAWvzB,IAAAA,OACXgyC,oBAAqBhyC,IAAAA,OACrB6wC,UAAW7wC,IAAAA,MC1Of,SAAekmB,IAAAA,KAAWmtB,IAE1B,SAASA,IAAyB,SAAEC,EAAQ,SAAE/yB,EAAQ,UAAEyH,EAAS,QAAEra,EAAO,SAAE4lC,EAAQ,YAAEC,IAClF,MAAM7B,EAAU,CACZ,gBAmBJ,OAhBI2B,GACA3B,EAAQl2C,KAAK,yBAGb8kB,GACAoxB,EAAQl2C,KAAK,yBAGbusB,GACA2pB,EAAQl2C,KAAKusB,GAGbwrB,GACA7B,EAAQl2C,KAAK,kBAIbyqB,IAAAA,cAAA,OACI8B,UAAW2pB,EAAQp1C,KAAK,KACxBoR,QAASA,GAAW,CAAEjH,GAAU6Z,GAAY5S,EAAQjH,KAEnD6sC,EAGGC,GACAttB,IAAAA,cAAA,OAAK8B,UAAU,uBACVwrB,GAKrB,CAEAH,GAAyBltB,UAAY,CACjCmtB,SAAUtzC,IAAAA,KAAetB,WACzBiP,QAAS3N,IAAAA,KACTuzC,SAAUvzC,IAAAA,KAAetB,WACzB6hB,SAAUvgB,IAAAA,KACVgoB,UAAWhoB,IAAAA,OACXwzC,YAAaxzC,IAAAA,QC5CjB,SAAekmB,IAAAA,KAAWutB,IAE1B,SAASA,IAAqB,gBAAEv4B,EAAe,uBAAEw4B,EAAsB,gBAAEjR,EAAe,SAAE8Q,EAAQ,SAAEhzB,IAChG,OACI2F,IAAAA,cAACmtB,GAAwB,CACrBC,SAAUI,IAA2BjR,EACrC90B,QAASA,IAAMuN,EAAgBunB,gBAAkBA,EACjDliB,SAAUA,GAETgzB,EAGb,CAEAE,GAAqBttB,UAAY,CAC7BjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD+jC,gBAAiBziC,IAAAA,KAAetB,WAChCg1C,uBAAwB1zC,IAAAA,KAAetB,WACvC60C,SAAUvzC,IAAAA,KAAetB,WACzB6hB,SAAUvgB,IAAAA,MClBd,SAAekmB,IAAAA,KAAWytB,IAE1B,SAASA,IAAiB,gBAAEz4B,IACxB,MAAMyQ,EXoGH,SAAuBzQ,GAC1B,OAAOktB,GAASltB,EAAiB,qBAAsBA,EAAgByQ,WAC3E,CWtGuBioB,CAAc14B,GAC3B0Q,EX+GH,SAAgC1Q,GACnC,OAAOktB,GAASltB,EAAiB,+BAAgCA,EAAgB0Q,oBACrF,CWjHgCioB,CAAuB34B,IAC5C0N,EAASkf,IAAcY,EAAAA,EAAAA,WAAS,GAEvC,MAAQ,CACJ9f,EAAU1C,IAAAA,cAACmtB,GAAwB,CAC/B5uC,IAAI,mBACJujB,UAAU,oBACVsrB,UAAU,EACVE,YAAY,wBAEZttB,IAAAA,cAAA,SACIvY,QAAUjL,GAAMA,EAAEooC,kBAClBvjC,MAAOqkB,EACPkoB,SAAWpxC,GAAMwY,EAAgB0Q,oBAAsBlpB,EAAER,OAAOqF,MAChEwsC,QAAUrxC,GAAoB,KAAdA,EAAEsxC,SAAkBlM,GAAW,GAC/C3gC,KAAK,SACLqY,KAAM,GACNpI,IAAK,KAGT8O,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,+hBAGX,KAE7B4hB,IAAAA,cAACmtB,GAAwB,CACrB5uC,IAAI,cACJujB,UAAU,oBACVsrB,SAAU1qB,GAAsC,MAA3BrY,WAAWob,GAChChe,QAASA,IAAMm6B,GAAYlf,GAC3B4qB,YAAY,mBAGR5qB,GACA1C,IAAAA,cAAA,WACIA,IAAAA,cAAA,SACIvY,QAAUjL,GAAMA,EAAEooC,kBAClBlhB,WAAW,EACXriB,MAAOokB,EACPmoB,SAAWpxC,GAAMwY,EAAgByQ,WAAajpB,EAAER,OAAOqF,MACvDwsC,QAAUrxC,GAAoB,KAAdA,EAAEsxC,SAAkBlM,GAAW,GAC/C3gC,KAAK,SACLqY,IAAK,EACLpI,IAAK,OAKjB8O,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,kdAKhD,CAEAqvC,GAAiBxtB,UAAY,CACzBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,YC1D3D,SAAewnB,IAAAA,KAAWiuB,IAE1B,SAASA,IAAQ,gBAACj5B,EAAe,eAAEk5B,IAE/B,MAAM5pC,EZiEH,SAAiC0Q,GACpC,OAAOktB,GAASltB,EAAiB,iCAAkCA,EAAgB1Q,qBACvF,CYnEiC6pC,CAAwBn5B,GAC/C0nB,EAAa2G,GAAcruB,GAC3BgM,EAAewiB,GAAgBxuB,GAC/BwoB,EAAiBiG,GAAkBzuB,GACnCyoB,EAAqBiG,GAAsB1uB,GAC3C4oB,EAAQgG,GAAS5uB,GAEvB,OACIgL,IAAAA,cAAA,OAAK8B,UAAU,eAEPosB,GACAluB,IAAAA,cAACmtB,GAAwB,CACrBC,SAAU5P,EACV/1B,QAASA,IAAMuN,EAAgB2sB,uBAC/B2L,YAAY,gBAEZttB,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eACL1a,EAAE,wKAMxB4hB,IAAAA,cAACmtB,GAAwB,CACrBC,SAAoB,WAAVxP,EACVn2B,QAASA,IAAMuN,EAAgB8pB,mBAC/BwO,YAAY,eAEZttB,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eACL1a,EAAE,qcAKpB4hB,IAAAA,cAACmtB,GAAwB,CACrBC,SAAU3P,EACVh2B,QAASA,IAAMuN,EAAgB0sB,2BAC/B4L,YAAY,oBAEZttB,IAAAA,cAAA,OAAK8B,UAAU,qCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,gVAKxC4hB,IAAAA,cAACytB,GAAgB,CAACz4B,gBAAiBA,IAEnCgL,IAAAA,cAACmtB,GAAwB,CACrBC,SAAUpsB,EACVvZ,QAASA,IAAMuN,EAAgBysB,qBAC/B6L,YAAY,iBAEZttB,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,msBAKxC4hB,IAAAA,cAACmtB,GAAwB,CACrBC,SAAU1Q,EACVj1B,QAASA,IAAMuN,EAAgB6pB,qBAC/ByO,YAAY,oBAEZttB,IAAAA,cAAA,OAAK8B,UAAU,kBACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,yUAKxC4hB,IAAAA,cAACmtB,GAAwB,CACrBC,SAAU9oC,EACVmD,QAASA,IAAMuN,EAAgB4pB,yBAC/B0O,YAAY,0BAEZttB,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,2NAMpD,CAEA6vC,GAAQhuB,UAAY,CAChBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD01C,eAAgBp0C,IAAAA,MC5FpB,SAAekmB,IAAAA,KAAWouB,IAE1B,SAASA,IAAe,gBAACp5B,EAAe,sBAAE8X,EAAqB,0BAAEuhB,EAAyB,eAAEH,IACxF,MAAMI,EAAiBtL,GAAkBhuB,GACnCu5B,EAAgBrL,GAAiBluB,GACjCuoB,EAAiBgG,GAAkBvuB,GAEzC,IAAIw5B,EAAc/uB,GAAa6uB,EAC3BA,EAAiB,IACjBE,GAAe,GAGnB,IAAIhC,EAAa/sB,GAAa8uB,EAC1BA,EAAgB,IAChB/B,GAAc,GAGlB,MAAM,MAAErvB,GbmCL,SAAyBnI,GAC5B,OAAOktB,GAASltB,EAAiB,wBAAyBA,EAAgB8B,aAC9E,CarCsB23B,CAAgBz5B,GAE5Bw4B,EbyCH,SAA4Bx4B,GAC/B,OAAOktB,GAASltB,EAAiB,2BAA4BA,EAAgBunB,gBACjF,Ca3CmCmS,CAAmB15B,IAC5C,kBAAE6nB,EAAiB,cAAED,GboDxB,SAAyB5nB,GAC5B,OAAOktB,GAASltB,EAAiB,wBAAyBA,EAAgB2nB,aAC9E,CatDiDgS,CAAgB35B,GAEvD45B,EAA2B,IAAI18B,IAAI4a,EAAsB/2B,KAAI,EAAGyP,WAAYA,KAElF,OACIwa,IAAAA,cAAA,OAAK8B,UAAY,mBAAiB3E,EAAQ,GAAK,oBAAsBphB,MAAO,CAAEyyC,cAAahC,eACvFxsB,IAAAA,cAAA,OAAK8B,UAAU,iBAEPyb,GACIvd,IAAAA,cAACiuB,GAAO,CACJj5B,gBAAiBA,EACjBk5B,eAAgBA,IAI5BluB,IAAAA,cAACmtB,GAAwB,CACrBrrB,UAAU,yBACVsrB,SAAU7P,EACV91B,QAASA,IAAMuN,EAAgBwsB,uBAC/B8L,YAAY,2BAEZttB,IAAAA,cAAA,OAAK8B,UAAU,wCACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,kzBAKxC4hB,IAAAA,cAACmtB,GAAwB,CACrBrrB,UAAU,0BACVsrB,UAAU,EACV3lC,QAASA,IAAMuN,EAAgBsqB,iBAC/BjlB,UAAWwiB,GAEX7c,IAAAA,cAAA,OAAK8B,UAAU,kBACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,oMAKxC4hB,IAAAA,cAACmtB,GAAwB,CACrBrrB,UAAU,0BACVsrB,UAAU,EACV3lC,QAASA,IAAMuN,EAAgBqqB,aAC/BhlB,UAAWuiB,GAEX5c,IAAAA,cAAA,OAAK8B,UAAU,kBACX9B,IAAAA,cAAA,OAAK+tB,UAAU,QAAQC,QAAQ,eAC3BhuB,IAAAA,cAAA,QAAMlH,KAAK,eAAe1a,EAAE,qMAMpC0uB,EAAsB/2B,KAAI,EAAEyP,QAAOG,aAAYC,aAAYtP,IAEnD0pB,IAAAA,cAACutB,GAAoB,CACjBhvC,IAAKjI,EACL0e,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiB52B,EACjB0U,SAAUzU,IAAcuX,GAEvB3X,MAOZopC,EAAyBld,IAAI,QAAU2c,GACxCruB,IAAAA,cAACutB,GAAoB,CACjBv4B,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiBvM,GAAkB7E,WACnC9Q,UAAW8C,GACd,OAMAyxB,EAAyBld,IAAI,SAAW2c,GACzCruB,IAAAA,cAACutB,GAAoB,CACjBv4B,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiBvM,GAAkB5E,cACnC/Q,UAAW8C,GACd,QAMAyxB,EAAyBld,IAAI,QAAU2c,GACxCruB,IAAAA,cAACutB,GAAoB,CACjBv4B,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiBvM,GAAkB3E,SACnChR,UAAW8C,GACd,OAMAyxB,EAAyBld,IAAI,QAAU2c,GACxCruB,IAAAA,cAACutB,GAAoB,CACjBv4B,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiBvM,GAAkB1E,QACnCjR,UAAW8C,GACd,MAKL6C,IAAAA,cAACutB,GAAoB,CACjBv4B,gBAAiBA,EACjBw4B,uBAAwBA,EACxBjR,gBAAiBvM,GAAkBhxB,IACnCqb,UAAU,GACb,QAOjB,CAEA+zB,GAAenuB,UAAY,CACvBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvDs0B,sBAAuB5M,EAAgBra,sBAAsBrN,WAC7D61C,0BAA2Bv0C,IAAAA,KAC3Bo0C,eAAgBp0C,IAAAA,MCpKL,MAAM+0C,WAAmB7uB,IAAAA,cAEpC5R,WAAAA,CAAYtW,GACRsd,MAAMtd,GAENhC,KAAKg5C,MAAQ,CACTtlC,aAAc,EACdC,cAAe,EACfslC,gBAAiB,CACb16B,KAAM,EACND,KAAM,GAEV0C,aAAc,CACVzC,KAAM,EACND,KAAM,IAIdte,KAAKovC,YAAcpvC,KAAKovC,YAAYlkC,KAAKlL,MACzCA,KAAKk5C,aAAel5C,KAAKk5C,aAAahuC,KAAKlL,MAC3CA,KAAKm5C,YAAcn5C,KAAKm5C,YAAYjuC,KAAKlL,MACzCA,KAAKo5C,cAAgBp5C,KAAKo5C,cAAcluC,KAAKlL,MAC7CA,KAAKq5C,eAAiBr5C,KAAKq5C,eAAenuC,KAAKlL,KACnD,CAEAs5C,iBAAAA,GACIt5C,KAAKu5C,UAAY,IAAIt6B,EAAkB,CACnCC,gBAAiBlf,KAAKgC,MAAMkd,gBAC5BC,cAAenf,KAAK2wC,GACpBvxB,MAAOpf,KAAKgC,MAAMod,MAClBC,kBAAmBrf,KAAKgC,MAAMqd,oBAElCrf,KAAKgC,MAAMkd,gBAAgB4a,mBAAqB95B,KAAKu5C,UAErDv5C,KAAKu5C,UAAUr9B,GAAG,gBAAiBsB,IAC/Bxd,KAAKw5C,SAASh8B,EAAO,IAGzBxd,KAAKw5C,SAAS,CACVP,gBAAiBj5C,KAAKgC,MAAMkd,gBAAgBghB,WAC5Clf,aAAchhB,KAAKgC,MAAMkd,gBAAgBuiB,gBAG7CzhC,KAAKgC,MAAMkd,gBAAgBhD,GAAG,qBAAsB+8B,IAChDj5C,KAAKw5C,SAAS,CAAEP,mBAAkB,IAGtCj5C,KAAKgC,MAAMkd,gBAAgBhD,GAAG,yBAA0B8E,IACpDhhB,KAAKw5C,SAAS,CAAEx4B,aAAcA,GAAe,GAErD,CAEAy4B,kBAAAA,CAAmBC,GACXA,EAAUxS,YAAclnC,KAAKgC,MAAMklC,WACnClnC,KAAKu5C,UAAUp5B,QAEvB,CAEAw5B,oBAAAA,GACI35C,KAAKu5C,UAAUlgC,UACfrZ,KAAKu5C,UAAY,IACrB,CAEAnK,WAAAA,CAAY1kC,GACR,IAAK1K,KAAK45C,UACN,OAGJ,IAAInT,EACJ,MAAMoT,EAAQ75C,KAAK2wC,GAAGz9B,wBAAwBiZ,KAE9CnsB,KAAKw5C,UAAS,EAAEP,kBAAiBj4B,eAActN,mBAE3C,IAAIomC,GADWpvC,EAAMo/B,QAAU+P,GACPnmC,EAExBomC,EAAa3+B,KAAKC,IAAI0+B,EAAY,GAClCA,EAAa3+B,KAAKqI,IAAIs2B,EAAY,GAElC,IAAIrZ,EAAQqZ,GAAc94B,EAAa1C,KAAO0C,EAAazC,MAAQyC,EAAazC,KAEhF,GAAuB,WAAnBve,KAAK45C,UAAwB,CAC7B,MAAMr2B,EAAQ01B,EAAgB36B,KAAO26B,EAAgB16B,KACrD,IAAIA,EAAOkiB,EAAQld,EAAMvjB,KAAK+5C,wBAC1Bz7B,EAAOmiB,EAAQld,GAAO,EAAEvjB,KAAK+5C,yBAgBjC,OAdIx7B,EAAOyC,EAAazC,OACpBA,EAAOyC,EAAazC,KACpBD,EAAOC,EAAOgF,GAGdjF,EAAO0C,EAAa1C,OACpBA,EAAO0C,EAAa1C,KACpBC,EAAOD,EAAOiF,GAGlBkjB,EAAkBA,KACP,CAACloB,OAAMD,SAGX,CACH26B,gBAAiBtwC,OAAOsoB,OAAO,CAAC,EAAGgoB,EAAiB,CAChD16B,OAAMD,SAGlB,CAAO,GAAuB,SAAnBte,KAAK45C,UAAsB,CAC9BnZ,EAAQwY,EAAgB36B,OACxBmiB,EAAQwY,EAAgB36B,MAG5B,MAAM07B,EAAeh5B,EAAa1C,OAAS26B,EAAgB36B,KAe3D,OAbAmoB,EAAkBA,IACVuT,EACO,CACHz7B,KAAMkiB,GAGH,CACHliB,KAAMkiB,EACNniB,KAAM26B,EAAgB36B,MAK3B,CACH26B,gBAAiBtwC,OAAOsoB,OAAO,CAAC,EAAGgoB,EAAiB,CAChD16B,KAAMkiB,IAGlB,CAAO,GAAuB,UAAnBzgC,KAAK45C,UAAuB,CAC/BnZ,EAAQwY,EAAgB16B,OACxBkiB,EAAQwY,EAAgB16B,MAG5B,MAAM07B,EAAcj5B,EAAazC,OAAS06B,EAAgB16B,KAe1D,OAbAkoB,EAAkBA,IACVwT,EACO,CACH37B,KAAMmiB,GAGH,CACHliB,KAAM06B,EAAgB16B,KACtBD,KAAMmiB,GAKX,CACHwY,gBAAiBtwC,OAAOsoB,OAAO,CAAC,EAAGgoB,EAAiB,CAChD36B,KAAMmiB,IAGlB,KACD,KACMgG,IAILA,EAAgB4B,iBAAkB,EAClCroC,KAAKgC,MAAMkd,gBAAgBunB,gBAAkBA,EAAe,GAEpE,CAEAyT,YAAAA,GACI5zC,OAAOkpC,iBAAiB,YAAaxvC,KAAKovC,aAC1C9oC,OAAOkpC,iBAAiB,UAAWxvC,KAAKk5C,aAC5C,CAEAA,YAAAA,GACIl5C,KAAK45C,UAAY,KACjBtzC,OAAOipC,oBAAoB,YAAavvC,KAAKovC,aAC7C9oC,OAAOipC,oBAAoB,UAAWvvC,KAAKk5C,aAC/C,CAEAC,WAAAA,CAAYzuC,GACR1K,KAAK45C,UAAY,SAEjB,MAAM,gBAACX,EAAe,aAAEj4B,EAAY,aAAEtN,GAAgB1T,KAAKg5C,MACrDa,EAAQ75C,KAAK2wC,GAAGz9B,wBAAwBiZ,KAExCoW,EAAc73B,EAAMo/B,QAAU+P,EAC9BM,GAAalB,EAAgB16B,KAAOyC,EAAazC,OAAOyC,EAAa1C,KAAO0C,EAAazC,MAAQ7K,GAAgB,EACjH0mC,GAAanB,EAAgB36B,KAAO0C,EAAazC,OAAOyC,EAAa1C,KAAO0C,EAAazC,MAAQ7K,GAAgB,EAEvH1T,KAAK+5C,yBAA2BxX,EAAY4X,IAAYC,EAAYD,GACpEn6C,KAAKk6C,cACT,CAEAd,aAAAA,GACIp5C,KAAK45C,UAAY,OACjB55C,KAAKk6C,cACT,CAEAb,cAAAA,GACIr5C,KAAK45C,UAAY,QACjB55C,KAAKk6C,cACT,CAEAt5B,MAAAA,GACI,MAAM,aAAEI,EAAY,gBAAEi4B,EAAe,aAAEvlC,EAAY,cAAEC,GAAkB3T,KAAKg5C,MAE5E,IAYI5F,EAZA+G,EAAYh/B,KAAKqI,IAAIrI,KAAKC,KAAK69B,EAAgB16B,KAAOyC,EAAazC,OAAOyC,EAAa1C,KAAO0C,EAAazC,MAAO,GAAI,GAAK7K,GAAgB,EAC3I0mC,EAAaj/B,KAAKqI,IAAIrI,KAAKC,KAAK69B,EAAgB36B,KAAO0C,EAAazC,OAAOyC,EAAa1C,KAAO0C,EAAazC,MAAO,GAAI,GAAK7K,GAAgB,EAiChJ,OA/BI4R,MAAM60B,KAAepvB,SAASovB,IAAclB,EAAgB36B,KAAO26B,EAAgB16B,QACnF47B,EAAY,IAGZ70B,MAAM80B,KAAervB,SAASqvB,IAAcnB,EAAgB36B,KAAO26B,EAAgB16B,QACnF67B,EAAY,GAMZnB,EAAgB5xB,OAASrnB,KAAKgC,MAAMq4C,YACpCjH,EAAQN,GAAU,CACdtvB,IAAKxC,EAAazC,KAClBnD,IAAK4F,EAAa1C,KAClB2zB,UAAWv+B,EACX2R,UAAW,MACXgC,MAAO4xB,EAAgB5xB,MACvB6qB,UAAW9qB,GACX2rB,kBAAmB,GACnBC,aAAc,EACdb,cAAe,CACX3qB,iBAAiB,EACjBE,aAAc,MACd3B,SAAU/lB,KAAKgC,MAAM+jB,UAEzBktB,WAAW,EACXC,UAAU,KAKdhpB,IAAAA,cAAA,OAAK8B,UAAU,yBACX9B,IAAAA,cAAA,OAAK8B,UAAU,mCACX9B,IAAAA,cAAA,UAAQuC,IAAMkkB,GAAO3wC,KAAK2wC,GAAKA,IAE/BzmB,IAAAA,cAAA,WACIA,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACInZ,EAAG,EACHO,EAAGqC,EACH7F,MAAO4F,EACPX,OAlCR,GAmCQiZ,UAAU,wBAIVonB,GAASA,EAAMnzC,KAAI,EAAGqyC,aAAY5iC,QAAO8M,OAAM2xB,YAAY3tC,KACvD,GAAI8kB,MAAMgtB,GACN,OAAO,KAGX,MAAMqD,EAAU,CAAC,YAAc,aAAYn5B,IAAS,aAAY2xB,KAEhE,OACIjkB,IAAAA,cAAA,KAAGzhB,IAAKjI,EAAGwrB,UAAW2pB,EAAQp1C,KAAK,MAC/B2pB,IAAAA,cAAA,QAAM5hB,EAAI,IAAGgqC,QAAiB3+B,MAE9BuW,IAAAA,cAAA,QAAMnZ,EAAGuhC,EAAa,EAAGhhC,EAAGqC,GACvBjE,GAEL,IAKhBwa,IAAAA,cAAA,QACInZ,EAAGopC,EACH7oC,EAAGqC,EACH7F,MAAOssC,EAAYD,EACnBpnC,OA9DR,GA+DQiZ,UAAU,gBACVijB,YAAajvC,KAAKm5C,cAGtBjvB,IAAAA,cAAA,QACI5hB,EAAE,8FACF0jB,UAAU,uBACVhB,UAAY,aAAYmvB,GAAaC,EAAYD,GAAW,KAAKxmC,KACjEs7B,YAAajvC,KAAKm5C,eAI1BjvB,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACInZ,EAAGopC,EACH7oC,EAAG,EACHxD,MAAOssC,EAAYD,EACnBpnC,OAAQY,EACRqY,UAAU,mBACVijB,YAAajvC,KAAKm5C,cAGtBjvB,IAAAA,cAAA,QACInZ,EAAGopC,EACH7oC,EAAG,EACHxD,MAAOssC,EAAYD,EACnBpnC,OAAQY,EAzFhB,GA0FQqY,UAAU,8BAIlB9B,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACI5hB,EAAE,6FACF0jB,UAAU,uBACVhB,UAAY,aAAYmvB,MAAcxmC,EAAgB,IAAI,KAC1Ds7B,YAAajvC,KAAKo5C,iBAI1BlvB,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACI5hB,EAAE,6FACF0jB,UAAU,uBACVhB,UAAY,aAAYovB,MAAczmC,EAAgB,IAAI,KAC1Ds7B,YAAajvC,KAAKq5C,mBAM1Br5C,KAAKgC,MAAMytC,eACXvlB,IAAAA,cAACzX,GAAa,CACVyM,gBAAiBlf,KAAKgC,MAAMkd,gBAC5BuwB,cAAezvC,KAAKgC,MAAMytC,cAC1BC,cAAc,EACdvxB,OAAQ6C,EACRrN,cAAeA,EACfD,aAAcA,KAMtC,EAIJqlC,GAAW3sB,aAAe,CACtBte,MAAO,EACPoB,YAAa,eAGjB6pC,GAAW5uB,UAAY,CACnBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD0c,MAAOpb,IAAAA,KACPkjC,UAAWljC,IAAAA,KACXqb,kBAAmBrb,IAAAA,KACnBq2C,UAAWr2C,IAAAA,KACX+hB,SAAU/hB,IAAAA,OACVyrC,cAAerlB,EAAgB3X,eCvWnC,SAAeyX,IAAAA,KAAWowB,IAE1B,SAASA,IAAc,OAAE/qC,EAAM,EAAE/O,EAAC,MAAEyF,EAAK,YAAEgpC,EAAW,MAAEnH,EAAK,gBAAE5oB,EAAe,YAAEjF,IAC5E,MAAMzM,EAAQuG,EAASxE,EAAO/B,MAAOhN,EAAG+O,EAAO0E,yBAG3ChO,EADU,QAAV6hC,EACQn/B,OAAOsoB,OAAO,CAAC,EAAGhrB,EAAO,CAC7Bs0C,gBAAiB/sC,IAGb7E,OAAOsoB,OAAO,CAAC,EAAGhrB,EAAO,CAC7BuH,UAIR,MAAMmoC,EAAU,CAAC,mBACb17B,GACA07B,EAAQl2C,KAAK,+BAGjB,MAAM+C,EAAO2zB,GAAc5mB,EAAQ/O,GAEnC,OACI0pB,IAAAA,cAAA,OACI8B,UAAW2pB,EAAQp1C,KAAK,KACxB0F,MAAOA,EACPgpC,YAAaA,EACbkI,YAAaA,IAAMj4B,EAAgB2pB,qBAAqBroC,GACxD42C,WAAYA,IAAMl4B,EAAgB2pB,qBAAqB,MACvDl3B,QAASA,IAAMuN,EAAgBypB,oBAAoBnoC,IAElDgC,EAGb,CAEA83C,GAAcnwB,UAAY,CACtB5a,OAAQ6a,EAAgBhd,aAAa1K,WACrCwc,gBAAiBlb,IAAAA,WAAqB8yB,IACtCt2B,EAAGwD,IAAAA,OAAiBtB,WACpBuD,MAAOjC,IAAAA,OACPirC,YAAajrC,IAAAA,KACb8jC,MAAO9jC,IAAAA,OAAiBtB,WACxBuX,YAAajW,IAAAA,MC9CF,MAAMw2C,WAA+BtwB,IAAAA,cAEhD5R,WAAAA,CAAYtW,GACRsd,MAAMtd,GAENhC,KAAKg5C,MAAQ,CACTyB,mBAAmB,GAGvBz6C,KAAK06C,wBAA0B16C,KAAK06C,wBAAwBxvC,KAAKlL,KACrE,CAEA06C,uBAAAA,GACI16C,KAAKw5C,UAAS,EAAGiB,wBACN,CACHA,mBAAoBA,KAGhC,CAEA75B,MAAAA,GACI,MAAM,SAAC22B,EAAQ,gBAAEr4B,EAAe,UAAE5P,EAAS,MAAEG,EAAK,MAAEC,EAAK,UAAE6nB,GAAav3B,KAAKgC,OAEvE,kBAAEy4C,GAAsBz6C,KAAKg5C,MAEnC,OACI9uB,IAAAA,cAAA,OACI8B,UAAY,6BAA2ByuB,EAAoB,2CAA6C,IACxG,kBAAiBnrC,EACjB,kBAAiBioB,GAEjBrN,IAAAA,cAAA,OAAK8B,UAAU,cAAcra,QAASA,IAAMuN,EAAgBwqB,YAAY,CAACp6B,eACpEG,EAAMkX,MAAM,EAAG8zB,EAAoB,EAAI,IAG5CvwB,IAAAA,cAAA,OAAK8B,UAAU,kCACX9B,IAAAA,cAAA,WACKqtB,EAEDrtB,IAAAA,cAAA,OAAK8B,UAAU,sBAAsBksB,QAAQ,cAAcvmC,QAAS3R,KAAK06C,yBACrExwB,IAAAA,cAAA,QACI5hB,EAAE,ySAId4hB,IAAAA,cAAA,OAAK8B,UAAU,mCACX9B,IAAAA,cAAA,SACI4tB,SAAWptC,GAAUwU,EAAgBuqB,SAAS,CAACn6B,YAAWI,MAAOhF,EAAMxE,OAAOqF,QAC9EovC,YAAY,cACZpvC,MAAOmE,GAAS,OAMxC,EAGJ8qC,GAAuBrwB,UAAY,CAC/BjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvD60C,SAAUvzC,IAAAA,KAAetB,WACzB4M,UAAWtL,IAAAA,OAAiBtB,WAC5B+M,MAAOzL,IAAAA,OAAiBtB,WACxBgN,MAAO1L,IAAAA,OACPuzB,UAAWvzB,IAAAA,QCZf,SAAekmB,IAAAA,KAAW0wB,IAE1B,SAASA,IAAU,gBAAE17B,EAAe,MAAE4oB,EAAK,UAAEZ,EAAS,UAAE3P,EAAS,oBAAEye,EAAoB,IACnF,MAAMzmC,EAASy9B,GAAU9tB,IAClBosB,EAAe6K,IAAoBzJ,EAAAA,EAAAA,UAAS,OAC5CmO,EAAcC,IAAmBpO,EAAAA,EAAAA,UAAS,CAC7C37B,EAAG,EACHO,EAAG,IAGDq1B,EAAoBsG,GAAqB/tB,GAEzC67B,GAASC,EAAAA,EAAAA,QAAO,OACfC,EAAUC,IAAexO,EAAAA,EAAAA,UAA+G,EAAtGn9B,EAAOtP,KAAI,EAAGuC,OAAM8K,QAAQ9M,KAAOgC,GAAQ8K,GAAQ9M,GAAGT,WAAWO,SAAQ8I,QAAO,CAACb,EAAGkD,IAAMlD,EAAIkD,GAAG,IAE1I,IAAI0vC,GACJxO,EAAAA,EAAAA,YAAU,KACFoO,EAAOK,UACPC,qBAAqBF,GAErBA,EAAwBnoC,uBAAsB,KAC1C,IAAK+nC,EAAOK,QACR,OAGJ,MAAMttC,EAAQ,IAAIitC,EAAOK,QAAQE,iBAAiB,+BAC7Cr7C,KAAK0wC,GAAOA,EAAG4K,cACfnyC,QAAO,CAACb,EAAGkD,IAAMlD,EAAIkD,GAAG,GAC7ByvC,EAAYptC,EAAM,IAE1B,GACD,CAACyB,EAAQwrC,EAAOK,UAEnB,MAAMn1C,EAzEV,UAAyB,gBAACiZ,EAAe,SAAE+7B,IACvC,MAAMzC,EAAiBtL,GAAkBhuB,GACnCu5B,EAAgBrL,GAAiBluB,GACjCuoB,EAAiBgG,GAAkBvuB,GAEzC,IAAIw5B,EAAc/uB,GAAa6uB,EAC3BA,EAAiB,IACjBE,GAAe,GAGnBA,GAAe,IAEXjR,IACAiR,GAAe,IAGnB,IASIjD,EATAiB,EAAa/sB,GAAa8uB,EAE1BA,EAAgB,IAChB/B,GAAc,GAGlBA,EAAav7B,KAAKC,IAAIs9B,EAAahC,GACnCgC,EAAcv9B,KAAKC,IAAIs9B,EAAahC,GAIpC,MAAM,aAAEhjC,GAAiBo5B,GAAe5tB,GAUxC,OARoBxL,EAAegjC,EAAagC,EAAcuC,IAG1DvE,EAAa,EACbgC,EAAc,EACdjD,EAAe,IAGZ,CAAEiD,cAAahC,aAAYjB,eACtC,CAmCkB+F,CAAgB,CAAEt8B,kBAAiB+7B,aAE3C36B,EAAOysB,GAAQ7tB,GACfihB,EjBCH,SAA6BjhB,GAChC,OAAOktB,GAASltB,EAAiB,4BAA6BA,EAAgBihB,iBAClF,CiBH6Bsb,CAAoBv8B,GAyD7C,OACIgL,IAAAA,cAAA,OAAK8B,UAAU,aAAa/lB,MAAOA,EAAOwmB,IAAKsuB,GAEvC7T,GACAhd,IAAAA,cAAA,OACI8B,UAAU,4BACV,kBAAgB,WAChB,kBAAiBuL,IAKrBjX,EAAKrgB,KAAI,CAAC+N,EAAMxN,KACPwN,EAAKuB,OAAOjP,QAAUggB,EAAKhgB,OAAS,EAC9B,KAIP4pB,IAAAA,cAACswB,GAAsB,CACnB/xC,IAAKjI,EACLkP,MAAO1B,EAAK0B,MACZJ,UAAWtB,EAAKsB,UAChBG,MAAOzB,EAAKyB,MACZyP,gBAAiBA,EACjBqY,UAAWA,GAGPvpB,EAAKuB,OAAOtP,KAAK4gB,GACTA,EAAatS,YACN,KAIP2b,IAAAA,cAACowB,GAAa,CACV7xC,IAAKoY,EAAalb,MAClB4J,OAAQsR,EACRrgB,EAAGqgB,EAAalb,MAChBspC,YAAaA,CAACvkC,EAAOgxC,IA5FvCC,EAACjxC,EAAOmW,KAC1B,IAAI+6B,EAAclxC,EAAMxE,OACxB,KAAO01C,GAAyC,eAA1BA,EAAY5vB,WAC9B4vB,EAAcA,EAAYt0C,WAE9B,MAAMu0C,EAAanxC,EAAMxE,OAAOgN,wBAAwBiZ,KACxD,IAAI2vB,EAAgBF,EAAY1oC,wBAAwBiZ,KACpD4vB,EAAsBH,EAAY31C,MAAMywC,WAE5C,MAAMzlC,EAASvG,EAAMo/B,QACfiN,EAASrsC,EAAMs/B,QACfgS,EAAetxC,EAAMo/B,QACrBmS,EAAevxC,EAAMs/B,QAE3BmM,EAAiBt1B,GACjBi6B,EAAgB,CACZ/pC,EAAGrG,EAAMo/B,QAAU74B,GAAU4qC,EAAaC,GAAiB,EAC3DxqC,EAAG5G,EAAMs/B,QAAU+M,EAAS,IAGhC,MAAM3H,EAAeC,IACbuM,EAAY31C,MAAMywC,aAAeqF,IACjCD,EAAgBF,EAAY1oC,wBAAwBiZ,KACpD4vB,EAAsBH,EAAY31C,MAAMywC,YAG5CoE,EAAgB,CACZ/pC,EAAGs+B,EAAUvF,QAAU74B,GAAU4qC,EAAaC,GAAiB,EAC/DxqC,EAAG+9B,EAAUrF,QAAU+M,EAAS,GAClC,EAGAzH,EAAa0H,IACf1wC,OAAOipC,oBAAoB,YAAaH,GACxC9oC,OAAOipC,oBAAoB,UAAWD,GAEtC,IAAIppC,EAAS8wC,EAAa9wC,OAC1B,KAAOA,KAAYA,EAAO+wC,SAAW,CAAC,GAAG3nC,aAAepJ,EAAO+wC,SAAW,CAAC,GAAGC,WAC1EhxC,EAASA,EAAOoB,WAGpB6uC,EAAiB,MACjBj3B,EAAgBmsB,aAAaxqB,EAAc3a,IAAWA,EAAO+wC,SAAW,CAAC,GAAG3nC,UAAWpJ,IAAWA,EAAO+wC,SAAW,CAAC,GAAGC,WAEpHF,EAAalN,UAAYkS,GAAgBhF,EAAahN,UAAYiS,GAClE/8B,EAAgByrB,uBAAuB9pB,EAAcm2B,EAAa9M,SACtE,EAGJ5jC,OAAOkpC,iBAAiB,YAAaJ,GACrC9oC,OAAOkpC,iBAAiB,UAAWF,GAEnCpwB,EAAgBksB,eAAe,EAwC+CuQ,CAAcjxC,EAAOmW,GAC/DinB,MAAOA,EACP5oB,gBAAiBA,EACjBjF,YAAa0sB,IAAsB9lB,EAAalb,OAASw6B,EAAiBvE,IAAI/a,UAW1GqmB,GACAhd,IAAAA,cAAA,OACI8B,UAAU,4BACV,kBAAgB,YAChB,kBAAiBuL,IAKrB+T,GACAphB,IAAAA,cAACowB,GAAa,CACVr0C,MAAO,CACHkmB,KAAM0uB,EAAa9pC,EACnBmb,IAAK2uB,EAAavpC,EAAI0kC,EACtB7H,SAAU,WACV+N,cAAe,OACfC,OAAQ,GAEZ5sC,OAAQ+7B,EACR9qC,EAAG8qC,EAAc3lC,MACjBmiC,MAAOA,EACP5oB,gBAAiBA,IAKrC,CAEA07B,GAAUzwB,UAAY,CAClBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,WACvDolC,MAAO9jC,IAAAA,OAAiBtB,WACxBwkC,UAAWljC,IAAAA,KAAetB,WAC1B60B,UAAWvzB,IAAAA,OACXgyC,oBAAqBhyC,IAAAA,QCtOzB,SAAekmB,IAAAA,KAAWkyB,IAE1B,SAASA,IAAW,MAAEC,IAClB,OACInyB,IAAAA,cAAA,OAAK8B,UAAU,iBACVqwB,EAGb,CAEAD,GAAWjyB,UAAY,CACnBkyB,MAAOr4C,IAAAA,OAAiBtB,YCP5B,MAAM45C,WAAqBpyB,IAAAA,cAEvB5R,WAAAA,CAAYtW,GACRsd,MAAMtd,GAENhC,KAAK83C,SAAW93C,KAAK83C,SAAS5sC,KAAKlL,KACvC,CAIA83C,QAAAA,CAASptC,GACLO,YAAW,KACPjL,KAAKgC,MAAMkd,gBAAgB4sB,WAAW9rC,KAAKgC,MAAM6e,aAAcnW,EAAMxE,OAAOq2C,QAAQ,GAE5F,CAEA37B,MAAAA,GACI,MAAM,aAAEC,GAAiB7gB,KAAKgC,MACxBwL,EAAQuG,EAAS8M,EAAarT,MAAOqT,EAAalb,MAAOkb,EAAa5M,yBAE5E,IAAIzR,EAAOqe,EAAare,MAAQqe,EAAavT,KAM7C,OAJK9K,IACDA,EAAOqe,EAAalb,OAIpBukB,IAAAA,cAAA,OAAK8B,UAAU,iBACX9B,IAAAA,cAAA,aACIA,IAAAA,cAAA,SACI/e,KAAK,WACLqxC,gBAAiB37B,EAAamb,OAC9BvP,IAAMkkB,GAAOA,GAAMA,EAAGnB,iBAAiB,SAAUxvC,KAAK83C,YAE1D5tB,IAAAA,cAAA,QAAM8B,UAAU,YAAY/lB,MAAO,CAAEqI,WAAYd,EAAOivC,YAAajvC,KAEpEhL,GAIjB,EAQW,SAASk6C,IAAQ,gBAAEx9B,IAC9B,MAAM3P,EAASy9B,GAAU9tB,GAEzB,OACIgL,IAAAA,cAAA,OAAK8B,UAAU,mBAEPzc,EAAOtP,KAAI,CAAC4gB,EAAcrgB,IACtB0pB,IAAAA,cAACoyB,GAAY,CACT7zC,IAAKjI,EACLqgB,aAAcA,EACd3B,gBAAiBA,MAMzC,CArBAo9B,GAAanyB,UAAY,CACrBtJ,aAAcuJ,EAAgBhd,aAAa1K,WAC3Cwc,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,YAqB3Dg6C,GAAQvyB,UAAY,CAChBjL,gBAAiBlb,IAAAA,WAAqB8yB,IAAiBp0B,YC1E5C,MAAMi6C,GAQjBrkC,WAAAA,EAAY,WAAEskC,GAAW,EAAI,aAAEC,GAAa,EAAI,cAAEC,GAAc,GAAU,CAAC,GACvE98C,KAAK+8C,kBAAoB,IAAI3gC,IAC7Bpc,KAAKg9C,YAAcJ,EACnB58C,KAAKi9C,cAAgBJ,EACrB78C,KAAKk9C,eAAiBJ,CAC1B,CAEAzgC,GAAAA,CAAI6C,GACAlf,KAAK+8C,kBAAkB1gC,IAAI6C,GAEvBlf,KAAKg9C,aACLh9C,KAAK48C,WAAW19B,GAGhBlf,KAAKi9C,eACLj9C,KAAK68C,aAAa39B,GAGlBlf,KAAKk9C,gBACLl9C,KAAK88C,cAAc59B,EAE3B,CAEA1Z,MAAAA,CAAO0Z,GACHlf,KAAK+8C,kBAAkBxgC,OAAO2C,EAIlC,CAEA49B,aAAAA,CAAc59B,GACVA,EAAgBhD,GAAG,sBAAuBgrB,IACtC,IAAK,IAAIiW,KAAwBn9C,KAAK+8C,kBAC9B79B,IAAoBi+B,IAIpBjW,EACAiW,EAAqB/R,gBAErB+R,EAAqB9R,aAAa,KAAM,MAEhD,GAER,CAEAuR,UAAAA,CAAW19B,GACPA,EAAgBhD,GAAG,4BAA6BuqB,IAC5C,IAAK,IAAI0W,KAAwBn9C,KAAK+8C,kBAC9B79B,IAAoBi+B,IAIxBA,EAAqB1W,gBAAkBA,EAC3C,GAER,CAEAoW,YAAAA,CAAa39B,GACTA,EAAgBhD,GAAG,yBAAyB,CAAC8qB,EAAcoW,KACvD,GAAIp9C,KAAKq9C,sBAAwBD,EAC7B,OAGJ,MAAME,EAA2D,IAAtCtW,EAAa1F,uBACnC0F,EAAalO,cACU,YAAvB94B,KAAKi9C,gBAAgC/9B,EAAgBirB,sBAEtDmT,IACAt9C,KAAKq9C,oBAAsBliC,KAAKoiC,UAGpC,IAAK,IAAIJ,KAAwBn9C,KAAK+8C,kBAC9B79B,IAAoBi+B,IAIpBG,EACAH,EAAqB7S,sBAAsBtqC,KAAKq9C,qBAIpDF,EAAqBtT,wBAAwB,CACzCxd,OAAQ2a,EAAa3a,OACrBC,OAAQ0a,EAAa1a,OACrB8d,gBAAgB,EAChBC,gBAAiBrqC,KAAKq9C,sBAE9B,GAER,E,uOC3CJ,SAAenzB,IAAAA,KAAWszB,IAEpBC,GAAsB,CACxB3V,MAAO,QACP6M,UAAU,EACV+I,gBAAgB,EAChBC,oBAAoB,EACpB7H,eAAe,EACfxF,cAAc,EACdD,wBAAwB,EACxBrZ,sBAAuB,GACvBohB,gBAAgB,EAChBhhB,wBAAwB,EACxBC,oBAAoB,GAGxB,SAASmmB,GAAQx7C,GACbA,EAAQ,IAAIy7C,MAAwBz7C,GAEpC,MAAMkd,GAAkB0+B,EAAAA,EAAAA,UAAQ,IAAM,IAAI9mB,GAAgB,CACtDS,UAAWv1B,EAAMrC,MACdqC,KACAA,EAAM67C,iCACT,KAEJlR,EAAAA,EAAAA,YAAU,IAKC,KACHztB,EAAgB7F,SAAS,GAE9B,CAAC6F,KAEJytB,EAAAA,EAAAA,YAAU,KACN3qC,EAAM87C,uBAAyB97C,EAAM87C,sBAAsB5+B,EAAgB,GAC5E,CAACA,EAAiBld,EAAM87C,yBAE3BnR,EAAAA,EAAAA,YAAU,KACNztB,EAAgBusB,iBAAmBzpC,EAAMypC,gBAAgB,GAC1D,CAACvsB,EAAiBld,EAAMypC,oBAE3BkB,EAAAA,EAAAA,YAAU,KACN3qC,EAAM+7C,cAAgB7+B,EAAgBhD,GAAG,cAAela,EAAM+7C,cAEvD,KACH/7C,EAAM+7C,cAAgB7+B,EAAgB5C,IAAI,cAAeta,EAAM+7C,aAAa,IAEjF,CAAC7+B,EAAiBld,EAAM+7C,gBAE3BpR,EAAAA,EAAAA,YAAU,KACNztB,EAAgBkc,UAAUp5B,EAAMuN,OAAO,GACxC,CAAC2P,EAAiBld,EAAMuN,UAE3Bo9B,EAAAA,EAAAA,YAAU,KACNztB,EAAgB4oB,MAAQ9lC,EAAM8lC,KAAK,GACpC,CAAC5oB,EAAiBld,EAAM8lC,QAE3B,MAAMA,EAAQgG,GAAS5uB,GACjB21B,EAAY7yC,EAAM6yC,WAAuB,WAAV/M,EAE/B/mB,EAAmB/e,EAAM+e,mBAA+B,WAAV+mB,EAAsB,OAAIhnC,IAC9E6rC,EAAAA,EAAAA,YAAU,KACNztB,EAAgB6B,iBAAmBA,CAAgB,GACpD,CAAC7B,EAAiB6B,KAErB4rB,EAAAA,EAAAA,YAAU,KACNztB,EAAgByQ,WAAa3tB,EAAM2tB,UAAU,GAC9C,CAACzQ,EAAiBld,EAAM2tB,cAE3Bgd,EAAAA,EAAAA,YAAU,KACNztB,EAAgB8X,sBAAwBh1B,EAAMg1B,qBAAqB,GACpE,CAAC9X,EAAiBld,EAAMg1B,yBAE3B2V,EAAAA,EAAAA,YAAU,KACNztB,EAAgBka,YAAcp3B,EAAMo3B,WAAW,GAChD,CAACla,EAAiBld,EAAMo3B,eAE3BuT,EAAAA,EAAAA,YAAU,IACD3qC,EAAMg8C,cAIX9+B,EAAgBhD,GAAG,wBAAyBla,EAAMg8C,cAC3C,KACH9+B,EAAgB5C,IAAI,wBAAyBta,EAAMg8C,aAAa,GALzD,QAOZ,CAAC9+B,EAAiBld,EAAMg8C,gBAE3BrR,EAAAA,EAAAA,YAAU,KACNztB,EAAgB2a,gBAAgB1Z,QAAQ,GACzC,CAACne,EAAM+Q,SAEV,MAAMm0B,EAAYsG,GAAatuB,IAEzB,OAAC++B,EAAM,WAAEC,GApInB,SAAsCl8C,GAAO,UAAEklC,EAAS,MAAEY,IACtD,MAAM,WAAEpQ,EAAU,OAAE3kB,EAAM,MAAEjF,GAAU9L,EAEhCk8C,EAAa,CACf,UACC,WAAUpW,KAGTmW,EAAS,CAAC,EAsBhB,OApBI/W,GACAgX,EAAWz+C,KAAK,sBAGhBi4B,GACAwmB,EAAWz+C,KAAK,sBAChBy+C,EAAWz+C,KAAK,yBACTsT,IACPmrC,EAAWz+C,KAAK,wBAEZw+C,EAAOlrC,OADW,iBAAXA,EACSA,EAAS,GAER,QAAOA,aAI5BjF,IACAmwC,EAAOnwC,MAAQA,GAGZ,CACHmwC,SACAC,aAER,CAkGiCC,CAA6Bn8C,EAAO,CAAEklC,YAAWY,UAExE9B,EAAYmH,GAAajuB,GACzB6mB,EAAWsH,GAAYnuB,GACvBwoB,EAAiBiG,GAAkBzuB,GAEnC+2B,EAAiD,kBAAzBj0C,EAAMi0C,eAA+Bj0C,EAAMi0C,eAA4B,WAAVnO,EACrF8M,EAAqC,kBAAnB5yC,EAAM4yC,SAAyB5yC,EAAM4yC,SAAsB,WAAV9M,EAEnEsW,EAAmB,CACrBl/B,kBACAy1B,SAAU3yC,EAAM2yC,SAChBC,WACAkB,cAAe9zC,EAAM8zC,cACrB/H,WAAY/rC,EAAM+rC,WAClBjG,QACAvQ,UAAWv1B,EAAMrC,GACjBq2C,oBAAqBh0C,EAAMg0C,oBAC3BC,iBACApB,aAGJ,OACI3qB,IAAAA,cAAA,OAAK8B,UAAWkyB,EAAW39C,KAAK,KAAM0F,MAAOg4C,EAAQ,kBAAiBj8C,EAAMrC,IAEpEqC,EAAMq6C,OACNnyB,IAAAA,cAACkyB,GAAU,CAACC,MAAOr6C,EAAMq6C,QAG7BnyB,IAAAA,cAAA,OAAK8B,UAAU,mCAEP0b,GACAxd,IAAAA,cAACwyB,GAAO,CAACx9B,gBAAiBA,IAG9BgL,IAAAA,cAAA,OAAK8B,UAAU,kCAEPhqB,EAAM8zC,eACN5rB,IAAAA,cAAC0wB,GAAS,CACN17B,gBAAiBA,EACjBgoB,UAAWA,EACXY,MAAO9lC,EAAM8lC,MACbvQ,UAAWv1B,EAAMrC,GACjBq2C,oBAAqBh0C,EAAMg0C,sBAK/Bh0C,EAAM27C,oBACNzzB,IAAAA,cAACouB,GAAc,CACXp5B,gBAAiBA,EACjB8X,sBAAuBh1B,EAAMg1B,sBAC7BuhB,0BAA2Bv2C,EAAMu2C,0BACjCH,eAAgBp2C,EAAMo2C,iBAI9BluB,IAAAA,cAAA,OAAK8B,UAAU,oBAEPkb,GACAhd,IAAAA,cAAA,OACI8B,UAAU,cACV,kBAAgB,WAChB,kBAAiBhqB,EAAMrC,GACvBsG,MAAO,CACH6H,MAAO6b,GACP5W,OAAoC,iBAArB/Q,EAAM+rC,WAA0B/rC,EAAM+rC,gBAAajtC,KAM1EilC,EAAS9lC,KAAI,CAAC+N,EAAMxN,IACT0pB,IAAAA,cAAC2rB,GAAK5pB,GAAA,CACTxjB,IAAKjI,EACLwN,KAAMA,EACN+nC,UAAWhQ,EAASzlC,OAASE,EAAI,GAC7B49C,MAKhBl0B,IAAAA,cAAA,OAAK8B,UAAU,qBACX9B,IAAAA,cAACkmB,GAAS,CACNlxB,gBAAiBA,EACjBE,MAAOpd,EAAMod,MACb2uB,WAAY/rC,EAAM+rC,WAClBsC,uBAAwBruC,EAAMquC,uBAC9BC,aAActuC,EAAMsuC,aACpBC,eAAgBvuC,EAAMuuC,eACtBlxB,kBAAmBrd,EAAMqd,kBACzBivB,gBAAiBtsC,EAAMssC,gBACvBC,YAAavsC,EAAMusC,YACnBC,6BAA8BxsC,EAAMwsC,6BACpCgC,aAAcxuC,EAAMwuC,aACpBf,cAAeztC,EAAMytC,cACrBhoB,WAAYzlB,EAAMylB,WAClB1B,SAAU/jB,EAAM+jB,WAGpBmE,IAAAA,cAACwqB,GAAK,CACFE,SAAUA,EACVD,SAAU3yC,EAAM2yC,SAChBz1B,gBAAiBA,EACjB21B,UAAWA,EACXC,UAAW9yC,EAAM8yC,UACjBrtB,WAAYzlB,EAAMylB,WAClB1B,SAAU/jB,EAAM+jB,SAChB4B,aAAc3lB,EAAMq8C,kBACpBtJ,iBAAkB/yC,EAAM+yC,mBAIxB/yC,EAAM07C,gBACNxzB,IAAAA,cAAA,OAAK8B,UAAU,yBACX9B,IAAAA,cAAC6uB,GAAU,CACP75B,gBAAiBA,EACjBE,MAAOpd,EAAMod,MACbC,kBAAmBrd,EAAMqd,kBACzBg7B,UAAWr4C,EAAMs8C,oBACjBv4B,SAAU/jB,EAAM+jB,SAChB0pB,cAAeztC,EAAMytC,kBAOjCzJ,EAAU/lC,KAAI,CAAC+N,EAAMxN,IACV0pB,IAAAA,cAAC2rB,GAAK5pB,GAAA,CACTxjB,IAAKjI,EACLwN,KAAMA,EACN+nC,UAAWv1C,GACP49C,MAMZlX,GACAhd,IAAAA,cAAA,OACI8B,UAAU,cACV,kBAAgB,YAChB,kBAAiBhqB,EAAMrC,GACvBsG,MAAO,CACH6H,MAAO6b,GACP5W,OAAoC,iBAArB/Q,EAAM+rC,WAA0B/rC,EAAM+rC,gBAAajtC,QAStG,CAEA08C,GAAQrzB,UAAY,CAChB5a,OAAQ6a,EAAgBhb,OAAO1M,WAC/B0c,MAAOpb,IAAAA,KACPizB,YAAajzB,IAAAA,KACbqb,kBAAmBrb,IAAAA,KAEnBg6C,aAAch6C,IAAAA,KACd+5C,aAAc/5C,IAAAA,KACd85C,sBAAuB95C,IAAAA,KACvBynC,iBAAkBznC,IAAAA,OAElB65C,8BAA+B75C,IAAAA,OAC/BszB,SAAUtzB,IAAAA,WAAqB24C,IAC/Bh9C,GAAIqE,IAAAA,OACJgyC,oBAAqBhyC,IAAAA,OAErB8jC,MAAO9jC,IAAAA,MAAgB,CAAC,MAAO,QAAS,WACxCq4C,MAAOr4C,IAAAA,OACP0zB,WAAY1zB,IAAAA,KACZ+pC,WAAY/pC,IAAAA,OACZ+O,OAAQ/O,IAAAA,OACR8J,MAAO9J,IAAAA,OAEP2wC,SAAU3wC,IAAAA,KACV05C,eAAgB15C,IAAAA,KAChB25C,mBAAoB35C,IAAAA,KACpB8xC,cAAe9xC,IAAAA,KACfssC,aAActsC,IAAAA,KACd4wC,SAAU5wC,IAAAA,KACViyC,eAAgBjyC,IAAAA,KAChB6wC,UAAW7wC,IAAAA,KACX8wC,UAAW9wC,IAAAA,MAAgB,CAAC,SAC5B+wC,iBAAkB/wC,IAAAA,KAClBq6C,kBAAmBr6C,IAAAA,KACnByjB,WAAYzjB,IAAAA,MAAgB,CAAC,MAAO,QACpC+hB,SAAU/hB,IAAAA,OACVs6C,oBAAqBt6C,IAAAA,KAErBqsC,uBAAwBrsC,IAAAA,KACxBo0C,eAAgBp0C,IAAAA,KAEhB2rB,WAAY3rB,IAAAA,OACZqzB,mBAAoBrzB,IAAAA,KACpBkzB,4BAA6BlzB,IAAAA,KAC7BmzB,mBAAoBnzB,IAAAA,KACpBozB,uBAAwBpzB,IAAAA,KACxB+c,iBAAkB/c,IAAAA,OAElBusC,eAAgBnmB,EAAgBvZ,eAEhCmmB,sBAAuB5M,EAAgBra,sBACvCwoC,0BAA2Bv0C,IAAAA,KAC3B+yB,wBAAyB/yB,IAAAA,OAEzBo1B,YAAahP,EAAgBhZ,YAC7Bk9B,gBAAiBlkB,EAAgBvY,gBACjC08B,YAAavqC,IAAAA,KACbwqC,6BAA8BxqC,IAAAA,KAC9ByrC,cAAerlB,EAAgB3X,cAC/B+9B,aAAcxsC,IAAAA,MC3WH,MAAMu6C,WAAkCxiC,EAEnDzD,WAAAA,EAAY,GAAE3Y,IACV2f,QAEAtf,KAAKw+C,IAAM7+C,EAEXK,KAAKy+C,aAAe,GACpBz+C,KAAK0+C,sBAAwB,IAAI3mB,IACjC/3B,KAAK2+C,sBAAwB,IAAI5mB,IACjC/3B,KAAK05B,gBAAkB,IAAI3B,IAC3B/3B,KAAK4+C,mCAAqC,IAAI7mB,IAC9C/3B,KAAK+8C,kBAAoB,IAAI3gC,IAC7Bpc,KAAK6+C,YAAc,GAEnB7+C,KAAKs6B,WAAa,IAAIvC,IACtB/3B,KAAKu6B,eAAiB,IAAIxC,IAE1B/3B,KAAKi5B,YAAa,EAElBj5B,KAAKkc,GAAG,wBAAwB,KAC5B,IAAK,IAAIgD,KAAmBlf,KAAK+8C,kBAC7B79B,EAAgBu/B,aAAez+C,KAAKy+C,YACxC,GAER,CAOArjB,SAAAA,CAAU7rB,GAEN,GAAIvP,KAAK6+C,YAAYv+C,SAAWiP,EAAOjP,OAAQ,CAC3C,IAAIk7B,GAAe,EACnB,IAAK,IAAIh7B,EAAI,EAAGA,EAAI+O,EAAOjP,OAAQE,IAC/B,GAAI+O,EAAO/O,KAAOR,KAAK6+C,YAAYr+C,GAAI,CACnCg7B,GAAe,EACf,KACJ,CAGJ,IAAKA,EACD,MAER,CAEAx7B,KAAK6+C,YAActvC,EAEnB,MAAMuvC,EAAe,IAAI1iC,IACnB2iC,EAAmB,IAAI3iC,IAAI7M,GAEjC,IAAK,IAAIsR,KAAgBtR,EAAQ,CAC7B,IAAIyvC,EAAan+B,EAAaxS,OAAS,EAEnCrO,KAAK0+C,sBAAsB9iB,IAAI/a,KAC/Bm+B,EAAah/C,KAAK0+C,sBAAsB51C,IAAI+X,IAGhDi+B,EAAaziC,IAAI2iC,GAEjB,IAAIlf,EAAY9/B,KAAK2+C,sBAAsB71C,IAAIk2C,GAC1Clf,IACDA,EAAY,IAAI1jB,IAChBpc,KAAK2+C,sBAAsBnoC,IAAIwoC,EAAYlf,IAG/CA,EAAUzjB,IAAIwE,EAClB,CAEA,MAAMo+B,EAAqB,IAAIH,GAAc/yB,OAE7C/rB,KAAKy+C,aAAe,GACpB,IAAIS,EAAoB,EAExB,IAAK,IAAIF,KAAcC,EAAoB,CACvC,MAAM1vC,EAAS,GAEf,IAAK,IAAIsR,KAAgB7gB,KAAK2+C,sBAAsB71C,IAAIk2C,GAAa,CACjE,IAAKD,EAAiBnjB,IAAI/a,GAAe,CACrC7gB,KAAK2+C,sBAAsB71C,IAAIk2C,GAAYziC,OAAOsE,GAClD,QACJ,CAEA,GAAI7gB,KAAK05B,gBAAgBkC,IAAI/a,GAAe,CACxCq+B,IACA3vC,EAAO9P,KAAKO,KAAK05B,gBAAgB5wB,IAAI+X,IACrC,QACJ,CAEA,MAAMrT,EAAQuG,EAAS8M,EAAarT,MAAO0xC,GACrC18C,EAAO2zB,GAActV,EAAcq+B,GACnC5b,EAAiB,IAChBziB,EACH5M,wBAAyBirC,EACzBC,uBAAwBH,EACxBxxC,QACAhL,QAGJxC,KAAK05B,gBAAgBljB,IAAIqK,EAAcyiB,GACvCtjC,KAAK4+C,mCAAmCpoC,IAAI0oC,EAAmBr+B,GAE/Dq+B,IACA3vC,EAAO9P,KAAK6jC,EAChB,CAEAtjC,KAAKy+C,aAAah/C,KAAK8P,EAC3B,CAEIvP,KAAKo/C,6BACLp/C,KAAKo/C,6BAA+Bp/C,KAAKo/C,6BAA+Bp/C,KAAKq/C,kBAAoBH,EAEjGl/C,KAAKo/C,6BAA+BF,EAExCl/C,KAAKq/C,kBAAoBH,EAEzBl/C,KAAKyc,KAAK,uBAAwBzc,KAAKs/C,YAC3C,CAOAC,uBAAAA,CAAwBrgC,GAChBlf,KAAK+8C,kBAAkBnhB,IAAI1c,KAI/Blf,KAAK+8C,kBAAkB1gC,IAAI6C,GAC3BA,EAAgBsgC,2BAA6Bx/C,KAC7Ckf,EAAgBu/B,aAAez+C,KAAKy+C,aAEpCv/B,EAAgBhD,GAAG,wBAAwB,EAAGqb,YAAWjoB,YAAWg8B,iBAAgB,CAAC,KACjF,GAAI/T,IAAcrY,EAAgBqY,UAC9B,OAGJ,MAAOkoB,EAAOC,EAAgBV,GAAcznB,EAAUljB,MAAM,KAC9C,iBAAVorC,GAA4BC,IAAmB1/C,KAAKw+C,KAIxDvzC,YAAW,KACPjL,KAAK2/C,WAAW,CAAErwC,YAAWg8B,gBAAe0T,cAAa,GAC3D,IAGN9/B,EAAgBhD,GAAG,sBAAuBgrB,IAClCA,IAAclnC,KAAKi5B,aAIvBj5B,KAAKi5B,WAAaiO,EAClBlnC,KAAKyc,KAAK,qBAAsBzc,KAAKi5B,YAAW,IAGpD/Z,EAAgBhD,GAAG,uBAAwBmjB,IACvC,IAAK,IAAI8d,KAAwBn9C,KAAK+8C,kBAC9B79B,IAAoBi+B,GAIxBA,EAAqBxd,uBAAuBN,EAChD,IAGJngB,EAAgBhD,GAAG,WAAW,KAC1Blc,KAAK+8C,kBAAkBxgC,OAAO2C,EAAgB,IAEtD,CASAygC,UAAAA,EAAW,UAAErwC,EAAS,cAAEg8B,EAAa,WAAE0T,IACnC,MAAMY,EAAiB5/C,KAAK6/C,WAEtBpkB,EAAiBz7B,KAAK4+C,mCAAmC91C,IAAIwiC,EAAcr3B,yBAC3EqvB,EAAiBtjC,KAAK05B,gBAAgB5wB,IAAI2yB,GAEhDz7B,KAAKy+C,aAAanb,EAAe6b,wBAAwBh6C,OACrDnF,KAAKy+C,aAAanb,EAAe6b,wBAAwBj9B,QAAQohB,GAAiB,GAEtFtjC,KAAKy+C,aAAanb,EAAe6b,wBAA0B,IAAIn/C,KAAKy+C,aAAanb,EAAe6b,yBAG5F7b,EAAe6b,uBADA,QAAfH,EACwCh/C,KAAK8/C,oBACvB,WAAfd,EACiCh/C,KAAK+/C,uBAELrrC,SAASsqC,GAGrD1b,EAAeh0B,UAAYA,SAGpBg0B,EAAet1B,KAEtBhO,KAAKy+C,aAAanb,EAAe6b,wBAA0B,IAAIn/C,KAAKy+C,aAAanb,EAAe6b,wBAAyB7b,GACzHtjC,KAAKy+C,aAAe,IAAIz+C,KAAKy+C,cAE7B,IAAK,IAAIO,EAAa,EAAGA,EAAah/C,KAAKy+C,aAAan+C,OAAQ0+C,IAAc,CAC1E,MAAMgB,EAAwBhgD,KAAKy+C,aAAaO,GAAY/+C,KAAI,EAAGgU,6BAC/DjU,KAAK4+C,mCAAmC91C,IAAImL,KAChDjU,KAAK2+C,sBAAsBnoC,IAAIwoC,EAAY,IAAI5iC,IAAI4jC,IAEnD,IAAK,IAAIn/B,KAAgBm/B,EACrBhgD,KAAK0+C,sBAAsBloC,IAAIqK,EAAcm+B,EAErD,CAEAh/C,KAAKyc,KAAK,uBAAwBzc,KAAKs/C,aACvCt/C,KAAKyc,KAAK,sBAAuBzc,KAAK6/C,WAAYD,EACtD,CAQAE,iBAAAA,GAEI,IAAIG,EAAkB,KAEtB,IAAK,IAAIz/C,EAAI,EAAGA,EAAIR,KAAKy+C,aAAan+C,QACE,IAAhCN,KAAKy+C,aAAaj+C,GAAGF,OADiBE,IAEtCy/C,EAAkBz/C,EAM1B,GAAwB,OAApBy/C,EACA,OAAOA,EAIXjgD,KAAKy+C,aAAe,CAAC,MAAOz+C,KAAKy+C,cACjC,IAAK,IAAIO,EAAa,EAAGA,EAAah/C,KAAKy+C,aAAan+C,OAAQ0+C,IAC5D,GAAKh/C,KAAKy+C,aAAaO,GAAY1+C,OAAnC,CAIAN,KAAKy+C,aAAaO,GAAc,IAAIh/C,KAAKy+C,aAAaO,IAEtD,IAAK,IAAI1b,KAAkBtjC,KAAKy+C,aAAaO,GACzC1b,EAAe6b,uBAAyBH,CAL5C,CASJ,OAAO,CACX,CAQAe,oBAAAA,GAEI,IAAIG,EAAqB,KAEzB,IAAK,IAAI1/C,EAAIR,KAAKy+C,aAAan+C,OAAS,EAAGE,GAAK,GACR,IAAhCR,KAAKy+C,aAAaj+C,GAAGF,OADsBE,IAE3C0/C,EAAqB1/C,EAM7B,OAA2B,OAAvB0/C,EACOA,GAIXlgD,KAAKy+C,aAAe,IAAIz+C,KAAKy+C,aAAc,IAEpCz+C,KAAKy+C,aAAan+C,OAAS,EACtC,CAEA,eAAIg/C,GACA,OAAOt/C,KAAKy+C,aAAal+B,QAAQhR,GAAWA,EAAOjP,QACvD,CAEA,UAAIiP,GACA,MAAO,IAAIvP,KAAK+8C,mBAAmB98C,KAAKif,GAAoBA,EAAgB3P,SAAQqM,MACxF,CAEA,cAAIikC,GACA,OAAO7/C,KAAKs/C,YAAYh/C,MAC5B,CAEA,aAAI4mC,GACA,OAAOlnC,KAAKi5B,UAChB,CAEA5f,OAAAA,GACIrZ,KAAKic,iBAEL,IAAK,IAAI+e,KAAYh7B,KAAKu6B,eAAevM,SACrCgN,EAASC,cAGbj7B,KAAKu6B,eAAejhB,OACxB,CAEA,iCAAIukC,GACA,MAAO,CACHrmB,gBAAiBx3B,KAAKs6B,WACtB7C,oBAAqBz3B,KAAKu6B,eAElC,CAEA4lB,gCAAAA,GACI,MAAMx6C,EAAQ3F,KAAKo/C,6BAInB,OAFAp/C,KAAKo/C,+BAEEz5C,CACX,E,uOCrUJ,SAAeukB,IAAAA,KAAWk2B,IAG1B,SAASA,GAAap+C,GAGlB,MAAM09C,GAAiB9B,EAAAA,EAAAA,UAAQ,IAAMziC,KAAKoiC,SAASx9C,SAAS,IAAI4mB,MAAM,IAAI,IAEpE05B,GAA4BzC,EAAAA,EAAAA,UAAQ,IAAM,IAAIW,GAA0B,CAC1E5+C,GAAI+/C,KACD19C,KACH,IAEEs9C,EvBiHH,SAAwBe,GAC3B,OAAOjU,GAASiU,EAA2B,uBAAwBA,EAA0Bf,YACjG,CuBnHwBgB,CAAeD,GAE7B/oB,GAAWsmB,EAAAA,EAAAA,UAAQ,IAAM,IAAIjB,GAAS,CACxCC,WAAY56C,EAAM46C,WAClBC,aAAc76C,EAAM66C,aACpBC,eAAe,KACf,IAEEyC,GAA0B3B,EAAAA,EAAAA,UAAQ,IAAMyC,EAA0Bd,wBAAwBr0C,KAAKm1C,IAA4B,CAACA,KAElI1T,EAAAA,EAAAA,YAAU,IAKC,KACH0T,EAA0BhnC,SAAS,GAExC,CAACgnC,KAEJ1T,EAAAA,EAAAA,YAAU,KACN3qC,EAAM87C,uBAAyB97C,EAAM87C,sBAAsBuC,EAA0B,GACtF,CAACA,EAA2Br+C,EAAM87C,yBAErCnR,EAAAA,EAAAA,YAAU,KACN0T,EAA0BjlB,UAAUp5B,EAAMuN,OAAO,GAClD,CAAC8wC,EAA2Br+C,EAAMuN,UAErCo9B,EAAAA,EAAAA,YAAU,IACD3qC,EAAMu+C,qBAIXF,EAA0BnkC,GAAG,uBAAwBla,EAAMu+C,qBACpD,KACHF,EAA0B/jC,IAAI,uBAAwBta,EAAMu+C,oBAAoB,GALzE,QAOZ,CAACF,EAA2Br+C,EAAMu+C,sBAErC,MAAMrZ,EAAYsG,GAAa6S,GAE/B,OACIn2B,IAAAA,cAAA,OAAK8B,UAAU,gBAEPkb,GAAallC,EAAMw+C,iBACft2B,IAAAA,cAAA,OAAK8B,UAAY,uBAAsBhqB,EAAM8lC,QAAS,kBAAkB,gBAAe4X,SAAsB,eAMjHJ,EAAYr/C,KAAI,CAACsP,EAAQ/O,IACrB0pB,IAAAA,cAACszB,GAAOvxB,GAAA,CACJxjB,IAAKjI,GACDwB,EAAK,CACTs1B,SAAUA,EACVumB,8BAA+BwC,EAA0BxC,8BACzDtuC,OAAQA,EACR5P,GAAK,gBAAe+/C,KAAkBl/C,IACtCw1C,oBAAqBh0C,EAAMw+C,gBAAkB,GAAK,EAClD1C,sBAAuByB,OAM/BrY,GACAhd,IAAAA,cAAA,OAAK8B,UAAY,uBAAsBhqB,EAAM8lC,QAAS,kBAAkB,gBAAe4X,YAAyB,eAMhI,CAEAU,GAAah0B,aAAe,CACxB0b,MAAO,SAGXsY,GAAaj2B,UAAYxhB,OAAOsoB,OAAO,CAAC,EAAGusB,GAAQrzB,UAAW,CAC1DyyB,WAAY54C,IAAAA,KACZ64C,aAAc74C,IAAAA,KACdw8C,gBAAiBx8C,IAAAA,KACjBu8C,oBAAqBv8C,IAAAA,M","sources":["webpack://Grapher/webpack/runtime/load script","webpack://Grapher/./src/grapher.scss","webpack://Grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://Grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://Grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://Grapher/./node_modules/prop-types/index.js","webpack://Grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://Grapher/./src/renderer/background.frag","webpack://Grapher/./src/renderer/background.vert","webpack://Grapher/./src/renderer/circle.frag","webpack://Grapher/./src/renderer/circle.vert","webpack://Grapher/./src/renderer/line.frag","webpack://Grapher/./src/renderer/line.vert","webpack://Grapher/webpack/bootstrap","webpack://Grapher/webpack/runtime/compat get default export","webpack://Grapher/webpack/runtime/define property getters","webpack://Grapher/webpack/runtime/ensure chunk","webpack://Grapher/webpack/runtime/get javascript chunk filename","webpack://Grapher/webpack/runtime/hasOwnProperty shorthand","webpack://Grapher/webpack/runtime/make namespace object","webpack://Grapher/webpack/runtime/publicPath","webpack://Grapher/webpack/runtime/jsonp chunk loading","webpack://Grapher/webpack/runtime/nonce","webpack://Grapher/external commonjs2 \"react\"","webpack://Grapher/./src/state/data_types.js","webpack://Grapher/./src/helpers/custom_prop_types.js","webpack://Grapher/./src/renderer/size_canvas.js","webpack://Grapher/./src/helpers/colors.js","webpack://Grapher/./src/helpers/color_to_vector.js","webpack://Grapher/./src/renderer/paths_from.js","webpack://Grapher/./src/state/rust_api.js","webpack://Grapher/./src/renderer/extract_vertices.js","webpack://Grapher/./src/renderer/create_gl_program.js","webpack://Grapher/./src/renderer/line_program.js","webpack://Grapher/./src/eventable.js","webpack://Grapher/./src/renderer/background_program.js","webpack://Grapher/./src/renderer/draw_zero_line.js","webpack://Grapher/./src/renderer/draw_bars.js","webpack://Grapher/./src/state/infer_type.js","webpack://Grapher/./src/renderer/graph_body_renderer.js","webpack://Grapher/./src/renderer/draw_area.js","webpack://Grapher/./src/renderer/draw_line.js","webpack://Grapher/./src/renderer/draw_background.js","webpack://Grapher/./src/helpers/format.js","webpack://Grapher/./src/helpers/axis_sizes.js","webpack://Grapher/./src/components/tooltip.jsx","webpack://Grapher/./src/components/context_menu.jsx","webpack://Grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://Grapher/./src/state/calculate_data_bounds.js","webpack://Grapher/./src/state/merge_bounds.js","webpack://Grapher/./src/state/expand_bounds.js","webpack://Grapher/./src/helpers/binary_search.js","webpack://Grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://Grapher/./src/renderer/scale_bounds.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://Grapher/./src/helpers/flatten_simple_data.js","webpack://Grapher/./src/state/calculate_tooltip_state.js","webpack://Grapher/./src/state/bound_calculators.js","webpack://Grapher/./src/state/space_conversions/condense_data_space.js","webpack://Grapher/./src/helpers/name_for_series.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://Grapher/./src/state/state_controller.js","webpack://Grapher/./src/state/get_default_bounds_calculator.js","webpack://Grapher/./src/helpers/generator_params_equal.js","webpack://Grapher/./src/state/calculate_annotations_state.js","webpack://Grapher/./src/state/selection_from_global_bounds.js","webpack://Grapher/./src/state/find_matching_axis.js","webpack://Grapher/./src/state/average_loop_times.js","webpack://Grapher/./src/state/bound_calculator_from_selection.js","webpack://Grapher/./src/state/hooks.js","webpack://Grapher/./src/components/annotations.jsx","webpack://Grapher/./src/components/draggable_points.jsx","webpack://Grapher/./src/components/vertical_lines.jsx","webpack://Grapher/./src/components/graph_body.jsx","webpack://Grapher/./src/grapher.scss?e17f","webpack://Grapher/./src/helpers/place_grid.js","webpack://Grapher/./src/components/x_axis.jsx","webpack://Grapher/./src/components/y_axis.jsx","webpack://Grapher/./src/components/range_selection_button_base.jsx","webpack://Grapher/./src/components/range_selection_button.jsx","webpack://Grapher/./src/components/percentile_button.jsx","webpack://Grapher/./src/components/options.jsx","webpack://Grapher/./src/components/range_selection.jsx","webpack://Grapher/./src/components/range_graph.jsx","webpack://Grapher/./src/components/series_key_item.jsx","webpack://Grapher/./src/components/series_key_axis_container.jsx","webpack://Grapher/./src/components/series_key.jsx","webpack://Grapher/./src/components/graph_title.jsx","webpack://Grapher/./src/components/sidebar.jsx","webpack://Grapher/./src/state/sync_pool.js","webpack://Grapher/./src/grapher.jsx","webpack://Grapher/./src/state/multigraph_state_controller.js","webpack://Grapher/./src/multigrapher.jsx"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"Grapher:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.cjs\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkGrapher\"] = globalThis[\"webpackChunkGrapher\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI()) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI().get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI().extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.dataBounds.minY, singleSeries.dataBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n\n if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n \n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight || stateController?.primaryRenderer?.boundingRect?.height}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar.jsx';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["inProgress","dataWebpackPrefix","___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","l","url","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","forEach","fn","setTimeout","bind","type","r","Symbol","toStringTag","value","p","b","baseURI","self","href","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","globalThis","require","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","xKey","yKey","xUnixDates","color","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","x","Date","startX","endX","lineOnly","Annotations","DraggablePoint","y","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","pixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","multigrapherSeriesIndex","colorToVector","startsWith","parts","split","part","parseFloat","match","test","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","rustApiModule","RustAPIPromise","then","default","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","LineProgram","constructor","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","Set","add","off","delete","size","emit","args","arguments","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","zero","hasNegatives","find","tuple","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","_intersectionTimeout","isIntersecting","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","className","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","position","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","classList","contains","closest","seriesToNearestPoint","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}
1
+ {"version":3,"file":"bundle.cjs","mappings":"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","sources":["webpack://Grapher/webpack/runtime/load script","webpack://Grapher/./src/grapher.scss","webpack://Grapher/./node_modules/css-loader/dist/runtime/api.js","webpack://Grapher/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://Grapher/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://Grapher/./node_modules/prop-types/index.js","webpack://Grapher/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://Grapher/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://Grapher/./src/renderer/background.frag","webpack://Grapher/./src/renderer/background.vert","webpack://Grapher/./src/renderer/circle.frag","webpack://Grapher/./src/renderer/circle.vert","webpack://Grapher/./src/renderer/line.frag","webpack://Grapher/./src/renderer/line.vert","webpack://Grapher/webpack/bootstrap","webpack://Grapher/webpack/runtime/compat get default export","webpack://Grapher/webpack/runtime/define property getters","webpack://Grapher/webpack/runtime/ensure chunk","webpack://Grapher/webpack/runtime/get javascript chunk filename","webpack://Grapher/webpack/runtime/hasOwnProperty shorthand","webpack://Grapher/webpack/runtime/make namespace object","webpack://Grapher/webpack/runtime/publicPath","webpack://Grapher/webpack/runtime/jsonp chunk loading","webpack://Grapher/webpack/runtime/nonce","webpack://Grapher/external commonjs2 \"react\"","webpack://Grapher/./src/state/data_types.js","webpack://Grapher/./src/helpers/custom_prop_types.js","webpack://Grapher/./src/renderer/size_canvas.js","webpack://Grapher/./src/helpers/colors.js","webpack://Grapher/./src/helpers/color_to_vector.js","webpack://Grapher/./src/renderer/paths_from.js","webpack://Grapher/./src/state/rust_api.js","webpack://Grapher/./src/renderer/extract_vertices.js","webpack://Grapher/./src/renderer/create_gl_program.js","webpack://Grapher/./src/renderer/line_program.js","webpack://Grapher/./src/eventable.js","webpack://Grapher/./src/renderer/background_program.js","webpack://Grapher/./src/renderer/draw_zero_line.js","webpack://Grapher/./src/renderer/draw_bars.js","webpack://Grapher/./src/state/infer_type.js","webpack://Grapher/./src/renderer/graph_body_renderer.js","webpack://Grapher/./src/renderer/draw_area.js","webpack://Grapher/./src/renderer/draw_line.js","webpack://Grapher/./src/renderer/draw_background.js","webpack://Grapher/./src/helpers/format.js","webpack://Grapher/./src/helpers/axis_sizes.js","webpack://Grapher/./src/components/tooltip.jsx","webpack://Grapher/./src/components/context_menu.jsx","webpack://Grapher/./src/state/space_conversions/simple_series_to_data_space.js","webpack://Grapher/./src/state/calculate_data_bounds.js","webpack://Grapher/./src/state/merge_bounds.js","webpack://Grapher/./src/state/expand_bounds.js","webpack://Grapher/./src/helpers/binary_search.js","webpack://Grapher/./src/state/space_conversions/data_space_to_selected_space.js","webpack://Grapher/./src/renderer/scale_bounds.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_render_space.js","webpack://Grapher/./src/helpers/flatten_simple_data.js","webpack://Grapher/./src/state/calculate_tooltip_state.js","webpack://Grapher/./src/state/bound_calculators.js","webpack://Grapher/./src/state/space_conversions/condense_data_space.js","webpack://Grapher/./src/helpers/name_for_series.js","webpack://Grapher/./src/state/space_conversions/selected_space_to_background_space.js","webpack://Grapher/./src/state/state_controller.js","webpack://Grapher/./src/state/get_default_bounds_calculator.js","webpack://Grapher/./src/helpers/generator_params_equal.js","webpack://Grapher/./src/state/calculate_annotations_state.js","webpack://Grapher/./src/state/selection_from_global_bounds.js","webpack://Grapher/./src/state/find_matching_axis.js","webpack://Grapher/./src/state/average_loop_times.js","webpack://Grapher/./src/state/bound_calculator_from_selection.js","webpack://Grapher/./src/state/hooks.js","webpack://Grapher/./src/components/annotations.jsx","webpack://Grapher/./src/components/draggable_points.jsx","webpack://Grapher/./src/components/vertical_lines.jsx","webpack://Grapher/./src/components/graph_body.jsx","webpack://Grapher/./src/grapher.scss?e17f","webpack://Grapher/./src/helpers/place_grid.js","webpack://Grapher/./src/components/x_axis.jsx","webpack://Grapher/./src/components/y_axis.jsx","webpack://Grapher/./src/components/range_selection_button_base.jsx","webpack://Grapher/./src/components/range_selection_button.jsx","webpack://Grapher/./src/components/percentile_button.jsx","webpack://Grapher/./src/components/options.jsx","webpack://Grapher/./src/components/range_selection.jsx","webpack://Grapher/./src/components/range_graph.jsx","webpack://Grapher/./src/components/series_key_item.jsx","webpack://Grapher/./src/components/series_key_axis_container.jsx","webpack://Grapher/./src/components/series_key.jsx","webpack://Grapher/./src/components/graph_title.jsx","webpack://Grapher/./src/components/sidebar.jsx","webpack://Grapher/./src/state/sync_pool.js","webpack://Grapher/./src/grapher.jsx","webpack://Grapher/./src/state/multigraph_state_controller.js","webpack://Grapher/./src/multigrapher.jsx"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"Grapher:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.grapher-night{position:relative;background:linear-gradient(to bottom right, #2a2a2b, #3e3e40);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-night *,.grapher-night :after,.grapher-night :before{box-sizing:content-box}.grapher-night .grapher-title{text-align:center;color:#fff;font-size:18px;margin-bottom:8px}.grapher-night .grapher-primary-container-outer{display:flex}.grapher-night .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#111, transparent 75%, transparent 100%);color:#eee;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-night .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-night .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-night .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-night .series-key .scale-label{display:inline-block;background:#111;color:silver;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-night .series-key .series-key-axis-container{display:inline-block;border:1px solid #111;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-night .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-night .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#e0e0e3}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-night .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-night .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-night .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-night .series-key .series-key-axis-container .label-input-toggler path{fill:#111}.grapher-night .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#e0e0e3}.grapher-night .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none;background:rgba(0,0,0,0)}.grapher-night .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-night .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px silver}.grapher-night .range-selection{color:silver;user-select:none}.grapher-night .range-selection.range-not-dates{color:#aaa}.grapher-night .range-selection .range-buttons{text-align:right}.grapher-night .range-selection .range-buttons .options-bar{display:inline-block}.grapher-night .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:silver;background:#000;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-night .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-night .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-night .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:6px;border-radius:2px;background:#505053}.grapher-night .range-selection .range-buttons .range-button.range-button-selected{color:silver;background:#000}.grapher-night .range-selection .range-buttons .range-button.range-button-disabled,.grapher-night .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#aaa;background:#7a7a7a}.grapher-night .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-night .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-night .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-night .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-night .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-night .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-night .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 8px 2px 0;color:#e0e0e3;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-night .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#e0e0e3}.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-night .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-night .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-night .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-night .grapher-main-row{display:flex}.grapher-night .grapher-main-row .central-container{width:100%}.grapher-night .range-graph-container{display:flex}.grapher-night .graph-body{width:100%;height:400px;position:relative}.grapher-night .graph-body canvas{width:100%;height:100%}.grapher-night .graph-body .grapher-tooltip,.grapher-night .graph-body .grapher-draggable-points,.grapher-night .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-night .graph-body .grapher-tooltip>svg,.grapher-night .graph-body .grapher-draggable-points>svg,.grapher-night .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-night .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-night .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(0,0,0,.6)}.grapher-night .graph-body .grapher-tooltip .tooltip-item text{fill:#f0f0f0;dominant-baseline:hanging;text-anchor:start}.grapher-night .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#000}.grapher-night .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #ccc}.grapher-night .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-night .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-night .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;max-width:max-content;width:200px}.grapher-night .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-night .graph-body .grapher-vertical-lines line{stroke:#ccc}.grapher-night .graph-body .grapher-vertical-lines polygon{fill:#ccc}.grapher-night .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-night .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(255,255,255,.3)}.grapher-night .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-night .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(0,0,0,.6);border:1px solid rgba(255,255,255,.3);color:#f0f0f0;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-night .graph-body .bounds-selection{position:absolute;background:rgba(255,255,255,.1)}.grapher-night .axis{overflow:visible;user-select:none}.grapher-night .axis.x-axis{width:1px;height:20px;display:block}.grapher-night .axis.x-axis .axis-item text{text-anchor:middle}.grapher-night .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-night .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-night .axis.y-axis{height:400px}.grapher-night .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-night .axis.y-axis .y-axis-label{text-anchor:middle;fill:#e0e0e3}.grapher-night .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-night .axis.y-axis .series-color-box{cursor:pointer}.grapher-night .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-night .axis .axis-line{stroke:silver;stroke-width:2px}.grapher-night .axis .axis-line-shadow{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night .axis .axis-item text{fill:#e0e0e3;font-size:8px}.grapher-night .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-night .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-night .range-selection-graph{width:100%;padding-bottom:14px}.grapher-night .range-selection-graph .graph-body-secondary{height:50px}.grapher-night .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(255,255,255,.1);cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#808083;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#303033}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#fff}.grapher-night .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#aaa;stroke-width:1;fill:#666;cursor:ew-resize}.grapher-night .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#aaa;fill:none}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-night .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#505053;stroke-width:1px}.grapher-night input,.grapher-night textarea{background:rgba(0,0,0,0);border:1px solid #505053;margin:2px 0;color:#e0e0e3;padding:1px 2px;text-align:center}.grapher-night input:focus,.grapher-night textarea:focus{outline:none;border-color:#e0e0e3}.grapher-night.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-night.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-night.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-night.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-night.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-night.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#ddd}.grapher-day{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-day *,.grapher-day :after,.grapher-day :before{box-sizing:content-box}.grapher-day .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-day .grapher-primary-container-outer{display:flex}.grapher-day .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-day .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-day .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-day .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-day .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-day .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-day .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-day .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-day .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-day .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-day .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-day .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-day .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-day .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-day .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-day .range-selection{color:#444;user-select:none}.grapher-day .range-selection.range-not-dates{color:#888}.grapher-day .range-selection .range-buttons{text-align:right}.grapher-day .range-selection .range-buttons .options-bar{display:inline-block}.grapher-day .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-day .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-day .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-day .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-day .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-day .range-selection .range-buttons .range-button.range-button-disabled,.grapher-day .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-day .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-day .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-day .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-day .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-day .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-day .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-day .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-day .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-day .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-day .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-day .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-day .grapher-main-row{display:flex}.grapher-day .grapher-main-row .central-container{width:100%}.grapher-day .range-graph-container{display:flex}.grapher-day .graph-body{width:100%;height:400px;position:relative}.grapher-day .graph-body canvas{width:100%;height:100%}.grapher-day .graph-body .grapher-tooltip,.grapher-day .graph-body .grapher-draggable-points,.grapher-day .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-day .graph-body .grapher-tooltip>svg,.grapher-day .graph-body .grapher-draggable-points>svg,.grapher-day .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-day .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-day .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-day .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-day .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-day .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-day .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-day .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-day .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-day .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-day .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-day .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-day .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-day .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-day .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-day .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-day .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-day .axis{overflow:visible;user-select:none}.grapher-day .axis.x-axis{width:1px;height:20px;display:block}.grapher-day .axis.x-axis .axis-item text{text-anchor:middle}.grapher-day .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-day .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-day .axis.y-axis{height:400px}.grapher-day .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-day .axis.y-axis .y-axis-label{text-anchor:middle;fill:#1f1f1c}.grapher-day .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-day .axis.y-axis .series-color-box{cursor:pointer}.grapher-day .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-day .axis .axis-line{stroke:#656565;stroke-width:2px}.grapher-day .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day .axis .axis-item text{fill:#1f1f1c;font-size:8px}.grapher-day .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-day .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-day .range-selection-graph{width:100%;padding-bottom:14px}.grapher-day .range-selection-graph .graph-body-secondary{height:50px}.grapher-day .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-day .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-day .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-day .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-day input,.grapher-day textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-day input:focus,.grapher-day textarea:focus{outline:none;border-color:#505053}.grapher-day.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-day.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-day.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-day.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-day.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-day.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}.grapher-export{position:relative;background:linear-gradient(to bottom right, #FFF, #FFF);padding:10px;font-family:sans-serif;font-size:12px;line-height:normal}.grapher-export *,.grapher-export :after,.grapher-export :before{box-sizing:content-box}.grapher-export .grapher-title{text-align:center;color:#000;font-size:18px;margin-bottom:8px}.grapher-export .grapher-primary-container-outer{display:flex}.grapher-export .grapher-primary-container-outer .grapher-sidebar{background:linear-gradient(#EEE, transparent 75%, transparent 100%);color:#111;padding:50px 6px 5px 10px;margin-left:-10px;margin-top:-10px;margin-bottom:-10px;overflow-y:auto;flex-shrink:0}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle{white-space:nowrap}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle+.series-toggle{margin-top:3px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle label{display:inline-block;position:relative;user-select:none}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input[type=checkbox]{opacity:0;cursor:pointer;height:0;width:0;margin-right:11px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:not(:checked)~.checkmark{background-color:rgba(0,0,0,0) !important}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle input:checked~.checkmark:after{display:block}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark{position:absolute;top:1px;left:0;height:7px;width:7px;background-color:#eee;border:2px solid;border-radius:1px}.grapher-export .grapher-primary-container-outer .grapher-sidebar .series-toggle .checkmark:after{content:\"\";position:absolute;display:none;left:.5px;top:-1.5px;width:3px;height:6px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.grapher-export .grapher-primary-container-outer .grapher-primary-container-body{width:100%;padding-left:2px}.grapher-export .series-key{text-align:center;margin-bottom:-14px;position:relative}.grapher-export .series-key .scale-label{display:inline-block;background:#b0b0b7;color:#000;transform:rotate(-90deg);width:24px;margin-left:-5px;vertical-align:top;margin-top:4px;padding-bottom:2px;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-axis-container{display:inline-block;border:1px solid #b0b0b7;min-width:18px;min-height:24px;vertical-align:top;white-space:nowrap}.grapher-export .series-key .series-key-axis-container+.series-key-axis-container{margin-left:4px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .scale-label{width:46px;margin-top:15px;margin-left:-15px;margin-right:-12px}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .series-key-axis-label-container{display:block}.grapher-export .series-key .series-key-axis-container.series-key-axis-container-showing-label .label-input-toggler path{fill:#505053}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body{display:inline-block}.grapher-export .series-key .series-key-axis-container .series-key-axis-container-body>div{white-space:initial}.grapher-export .series-key .series-key-axis-container .series-key-axis-label-container{display:none}.grapher-export .series-key .series-key-axis-container .label-input-toggler{width:16px;cursor:pointer;display:inline-block;vertical-align:top;margin:4px 2px}.grapher-export .series-key .series-key-axis-container .label-input-toggler path{fill:#b0b0b7}.grapher-export .series-key .series-key-axis-container .label-input-toggler:hover path{fill:#505053}.grapher-export .series-key .series-key-item{border:1px solid currentColor;padding:2px;margin:2px;display:inline-block;cursor:pointer;user-select:none}.grapher-export .series-key .series-key-item+.series-key-item{margin-left:4px}.grapher-export .series-key .series-key-item.series-key-item-highlighted{box-shadow:0 0 4px #000}.grapher-export .range-selection{color:#444;user-select:none}.grapher-export .range-selection.range-not-dates{color:#888}.grapher-export .range-selection .range-buttons{text-align:right}.grapher-export .range-selection .range-buttons .options-bar{display:inline-block}.grapher-export .range-selection .range-buttons .option-tooltip{position:relative;display:inline-block;border-bottom:1px dotted #000}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text{visibility:hidden;color:#000;background:#fff;text-align:center;padding:5px 5px;border-radius:6px;position:absolute;z-index:1;border:1px solid #000;width:120px;margin-left:-65px;top:calc(100% + 7px);left:50%}.grapher-export .range-selection .range-buttons .option-tooltip:hover .option-tooltip-text{visibility:visible}.grapher-export .range-selection .range-buttons .option-tooltip .option-tooltip-text::after{content:\" \";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.grapher-export .range-selection .range-buttons .range-button{display:inline-block;cursor:pointer;padding:4px 8px;margin-left:4px;border-radius:2px;background:#fff;border:1px dotted silver}.grapher-export .range-selection .range-buttons .range-button.range-button-selected{color:#000;background:#fff;border:1px solid #000}.grapher-export .range-selection .range-buttons .range-button.range-button-disabled,.grapher-export .range-selection .range-buttons .range-button.range-button-selected.range-button-disabled{cursor:not-allowed;color:#888;background:#eee}.grapher-export .range-selection .range-buttons .range-button .icon-container{position:relative;width:0}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-narrow svg{left:-3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square{width:5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-square svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448{width:3px}.grapher-export .range-selection .range-buttons .range-button .icon-container.icon-container-448 svg{left:-5px}.grapher-export .range-selection .range-buttons .range-button .icon-container:before{content:\"A\";opacity:0}.grapher-export .range-selection .range-buttons .range-button .icon-container svg{height:15px;position:absolute;top:-1px;left:-4px}.grapher-export .range-selection .range-buttons .range-selection-history+.range-selection-history{margin-right:8px;margin-left:4px}.grapher-export .range-selection .range-buttons .percentile-button>div{display:inline-block}.grapher-export .range-selection .range-buttons .percentile-button input{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 8px 2px 0;color:#222;padding:1px 2px;width:20px;font-size:11px;-moz-appearance:textfield}.grapher-export .range-selection .range-buttons .percentile-button input:focus{outline:none;border-color:#505053}.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-outer-spin-button,.grapher-export .range-selection .range-buttons .percentile-button input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.grapher-export .range-selection .range-buttons .percentile-button .icon-container.icon-container-narrow svg{height:12px;top:1px;left:-5px}.grapher-export .range-selection .range-buttons .showing-options-button{margin-right:8px}.grapher-export .grapher-main-row{display:flex}.grapher-export .grapher-main-row .central-container{width:100%}.grapher-export .range-graph-container{display:flex}.grapher-export .graph-body{width:100%;height:400px;position:relative}.grapher-export .graph-body canvas{width:100%;height:100%}.grapher-export .graph-body .grapher-tooltip,.grapher-export .graph-body .grapher-draggable-points,.grapher-export .graph-body .grapher-vertical-lines{position:absolute;top:0;left:0;right:0;z-index:20}.grapher-export .graph-body .grapher-tooltip>svg,.grapher-export .graph-body .grapher-draggable-points>svg,.grapher-export .graph-body .grapher-vertical-lines>svg{position:absolute;overflow:visible;left:0}.grapher-export .graph-body .grapher-vertical-lines{pointer-events:none;user-select:none}.grapher-export .graph-body .grapher-tooltip .tooltip-item path{fill:rgba(255,255,255,.6)}.grapher-export .graph-body .grapher-tooltip .tooltip-item text{fill:#0f0f0f;dominant-baseline:hanging;text-anchor:start}.grapher-export .graph-body .grapher-tooltip .tooltip-item.tooltip-item-fixed path{fill:#fff}.grapher-export .graph-body .grapher-tooltip .line{position:absolute;height:400px;border-left:1px solid #333}.grapher-export .graph-body .grapher-tooltip .custom-tooltip-container{position:absolute}.grapher-export .graph-body .grapher-context-menu{position:absolute;top:0;left:0}.grapher-export .graph-body .grapher-context-menu .menu-item .menu-text{user-select:all;position:absolute;top:0;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;max-width:max-content;width:200px}.grapher-export .graph-body .grapher-draggable-points circle{cursor:pointer}.grapher-export .graph-body .grapher-vertical-lines line{stroke:#333}.grapher-export .graph-body .grapher-vertical-lines polygon{fill:#333}.grapher-export .graph-body .grapher-annotations{position:absolute;top:0;pointer-events:none;user-select:none;z-index:10}.grapher-export .graph-body .grapher-annotations .grapher-annotation{position:absolute}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-marker{display:inline-block;background:rgba(0,0,0,.3)}.grapher-export .graph-body .grapher-annotations .grapher-annotation.grapher-annotation-range .annotation-range-marker{display:inline-block;background-color:rgba(128,128,128,.2);background-image:repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);background-size:40px 40px;border-right:1px solid #fff;border-left:1px solid #fff}.grapher-export .graph-body .grapher-annotations .grapher-annotation .annotation-text{position:absolute;background:rgba(255,255,255,.6);border:1px solid rgba(0,0,0,.3);color:#0f0f0f;padding:2px 4px;white-space:nowrap;font-size:10px;z-index:10}.grapher-export .graph-body .bounds-selection{position:absolute;background:rgba(0,0,0,.02)}.grapher-export .axis{overflow:visible;user-select:none}.grapher-export .axis.x-axis{width:1px;height:20px;display:block}.grapher-export .axis.x-axis .axis-item text{text-anchor:middle}.grapher-export .axis.x-axis .axis-item.axis-item-first text{text-anchor:start}.grapher-export .axis.x-axis .axis-item.axis-item-last text{text-anchor:end}.grapher-export .axis.y-axis{height:400px}.grapher-export .axis.y-axis .axis-item text{text-anchor:end;alignment-baseline:middle}.grapher-export .axis.y-axis .y-axis-label{text-anchor:middle;fill:#000}.grapher-export .axis.y-axis .y-axis-label.y-axis-big-label{font-size:18px}.grapher-export .axis.y-axis .series-color-box{cursor:pointer}.grapher-export .axis.y-axis.y-axis-right .axis-item text{text-anchor:start}.grapher-export .axis .axis-line{stroke:#000;stroke-width:1px}.grapher-export .axis .axis-line-shadow{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export .axis .axis-item text{fill:#000;font-size:8px}.grapher-export .axis .axis-item.axis-item-major .axis-tick{stroke-width:2px}.grapher-export .axis .axis-item.axis-item-big-labels text{font-size:16px}.grapher-export .range-selection-graph{width:100%;padding-bottom:14px}.grapher-export .range-selection-graph .graph-body-secondary{height:50px}.grapher-export .range-selection-graph .graph-body-secondary svg{position:absolute;left:0;height:50px;width:100%;overflow:visible}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection{fill:rgba(0,0,0,.02);cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar{fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-track{fill:#eee}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-rifles{fill:none;stroke-width:1;stroke:#333}.grapher-export .range-selection-graph .graph-body-secondary svg .selection-bar-handle{stroke:#333;stroke-width:1;fill:#b0b0b7;cursor:ew-resize}.grapher-export .range-selection-graph .graph-body-secondary svg .target-selection-outline{stroke:#333;fill:none}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item text{fill:#9f9f9f;text-anchor:start;font-size:8px;user-select:none;dominant-baseline:text-after-edge}.grapher-export .range-selection-graph .graph-body-secondary svg .axis-item path{stroke:#bfbfbf;stroke-width:1px}.grapher-export input,.grapher-export textarea{background:rgba(0,0,0,0);border:1px solid #e0e0e3;margin:2px 0;color:#222;padding:1px 2px;text-align:center}.grapher-export input:focus,.grapher-export textarea:focus{outline:none;border-color:#505053}.grapher-export.grapher-dragging-y .y-axis{border:2px dashed silver;margin:-2px;flex-shrink:0}.grapher-export.grapher-dragging-y .y-axis+.y-axis{border-left:none}.grapher-export.grapher-fullscreen{height:calc(100vh - 2*10px)}.grapher-export.grapher-fixed-height .grapher-primary-container-outer{height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body{height:100%;display:flex;flex-direction:column}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row{flex-grow:1}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container{display:flex;flex-direction:column;height:100%}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .central-container>.graph-body{flex-grow:1;height:unset}.grapher-export.grapher-fixed-height .grapher-primary-container-outer .grapher-primary-container-body .grapher-main-row .axis.y-axis{height:calc(100% - 40px)}.grapher-export.new-grapher{height:auto;border:2px dashed silver;text-align:center;color:#222}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/grapher.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@mixin grapher(\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n\\n $background-color-1: #2a2a2b,\\n $background-color-2: #3e3e40,\\n\\n $tooltip-line-color: #CCC,\\n $tooltip-background-color: rgba(0, 0, 0, 0.6),\\n $tooltip-text-color: #F0F0F0,\\n $vertical-line-color: #CCC,\\n\\n $axis-line-color: silver,\\n $axis-line-width: 2px,\\n $axis-tick-color: #505053,\\n $axis-text-color: #E0E0E3,\\n\\n $range-selection-text-color: silver,\\n $range-selection-button-color: #505053,\\n $range-selection-button-selected-color: black,\\n $range-selection-text-selected-color: silver,\\n $range-selection-text-color-faded: #AAA,\\n $range-selection-button-color-faded: #7A7A7A,\\n $range-selection-button-border: null,\\n $range-selection-selected-button-border: null,\\n\\n $range-graph-selection-bar-size: 14px,\\n $range-graph-selection-range-color: rgba(255, 255, 255, 0.1),\\n $range-graph-selection-outline-color: #AAA,\\n $range-graph-selection-bar-color: #808083,\\n $range-graph-selection-bar-track-color: #303033,\\n $range-graph-selection-bar-rifles-color: #FFF,\\n $range-graph-handle-color: #AAA,\\n $range-graph-handle-fill-color: #666,\\n $range-graph-axis-text-color: #9f9f9f,\\n\\n $annotation-background-color: rgba(255, 255, 255, 0.3),\\n\\n $series-key-axis-container-color: #111,\\n $series-key-input-border-color: #505053,\\n $series-key-input-selected-border-color: #E0E0E3,\\n $series-key-input-text-color: #E0E0E3,\\n $series-key-background: transparent,\\n $scale-label-color: silver,\\n $series-key-shadow-color: silver,\\n\\n $title-color: white,\\n\\n $sidebar-background-color: #111,\\n $sidebar-text-color: #EEE,\\n\\n $new-grapher-color: #DDD\\n) {\\n $x-axis-height: 20px;\\n $padding: 10px;\\n\\n $axis-z-index: 0;\\n $graph-body-z-index: 1;\\n\\n position: relative;\\n background: linear-gradient(to bottom right, $background-color-1, $background-color-2);\\n padding: $padding;\\n\\n font-family: sans-serif;\\n font-size: 12px;\\n line-height: normal;\\n\\n *, :after, :before {\\n box-sizing: content-box;\\n }\\n\\n .grapher-title {\\n text-align: center;\\n color: $title-color;\\n font-size: 18px;\\n margin-bottom: 8px;\\n }\\n\\n .grapher-primary-container-outer {\\n display: flex;\\n\\n .grapher-sidebar {\\n background: linear-gradient($sidebar-background-color, transparent 75%, transparent 100%);\\n color: $sidebar-text-color;\\n padding: 50px 6px 5px 10px;\\n margin-left: -$padding;\\n margin-top: -$padding;\\n margin-bottom: -$padding;\\n overflow-y: auto;\\n flex-shrink: 0;\\n\\n .series-toggle {\\n white-space: nowrap;\\n\\n & + .series-toggle {\\n margin-top: 3px;\\n }\\n\\n label {\\n display: inline-block;\\n position: relative;\\n user-select: none;\\n }\\n\\n input[type='checkbox'] {\\n opacity: 0;\\n cursor: pointer;\\n height: 0;\\n width: 0;\\n margin-right: 11px;\\n }\\n\\n input:not(:checked) ~ .checkmark {\\n background-color: transparent !important;\\n }\\n\\n input:checked ~ .checkmark:after {\\n display: block;\\n }\\n\\n .checkmark {\\n position: absolute;\\n top: 1px;\\n left: 0;\\n height: 7px;\\n width: 7px;\\n background-color: #eee;\\n border: 2px solid;\\n border-radius: 1px;\\n }\\n\\n .checkmark:after {\\n content: \\\"\\\";\\n position: absolute;\\n display: none;\\n\\n left: 0.5px;\\n top: -1.5px;\\n width: 3px;\\n height: 6px;\\n border: solid white;\\n border-width: 0 2px 2px 0;\\n -webkit-transform: rotate(45deg);\\n -ms-transform: rotate(45deg);\\n transform: rotate(45deg);\\n }\\n }\\n }\\n\\n .grapher-primary-container-body {\\n width: 100%;\\n padding-left: 2px;\\n }\\n }\\n\\n .series-key {\\n text-align: center;\\n margin-bottom: -14px;\\n position: relative;\\n\\n .scale-label {\\n display: inline-block;\\n background: $series-key-axis-container-color;\\n color: $scale-label-color;\\n transform: rotate(-90deg);\\n width: 24px;\\n margin-left: -5px;\\n vertical-align: top;\\n margin-top: 4px;\\n padding-bottom: 2px;\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .series-key-axis-container {\\n display: inline-block;\\n border: 1px solid $series-key-axis-container-color;\\n\\n min-width: 18px;\\n min-height: 24px;\\n vertical-align: top;\\n\\n white-space: nowrap;\\n\\n & + .series-key-axis-container {\\n margin-left: 4px;\\n }\\n\\n &.series-key-axis-container-showing-label {\\n .scale-label {\\n width: 46px;\\n margin-top: 15px;\\n margin-left: -15px;\\n margin-right: -12px;\\n }\\n\\n .series-key-axis-label-container {\\n display: block;\\n }\\n\\n .label-input-toggler {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n\\n .series-key-axis-container-body {\\n display: inline-block;\\n\\n & > div {\\n white-space: initial;\\n }\\n }\\n\\n .series-key-axis-label-container {\\n display: none;\\n }\\n\\n .label-input-toggler {\\n width: 16px;\\n cursor: pointer;\\n display: inline-block;\\n vertical-align: top;\\n margin: 4px 2px;\\n\\n path {\\n fill: $series-key-axis-container-color;\\n }\\n\\n &:hover {\\n path {\\n fill: $series-key-input-selected-border-color;\\n }\\n }\\n }\\n }\\n\\n .series-key-item {\\n border: 1px solid currentColor;\\n padding: 2px;\\n margin: 2px;\\n display: inline-block;\\n cursor: pointer;\\n user-select: none;\\n background: $series-key-background;\\n\\n & + .series-key-item {\\n margin-left: 4px;\\n }\\n\\n &.series-key-item-highlighted {\\n box-shadow: 0 0 4px $series-key-shadow-color;\\n }\\n }\\n }\\n\\n .range-selection {\\n color: $range-selection-text-color;\\n user-select: none;\\n\\n &.range-not-dates {\\n color: $range-selection-text-color-faded;\\n }\\n\\n .range-buttons {\\n text-align: right;\\n\\n .options-bar {\\n display: inline-block;\\n }\\n\\n .option-tooltip {\\n position: relative;\\n display: inline-block;\\n border-bottom: 1px dotted black;\\n\\n .option-tooltip-text {\\n visibility: hidden;\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n text-align: center;\\n padding: 5px 5px;\\n border-radius: 6px;\\n position: absolute;\\n z-index: 1;\\n border: 1px solid black;\\n\\n width: 120px;\\n margin-left: -65px;\\n top: calc(100% + 7px);\\n left: 50%;\\n }\\n\\n &:hover .option-tooltip-text {\\n visibility: visible;\\n }\\n\\n .option-tooltip-text::after {\\n content: \\\" \\\";\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n margin-left: -5px;\\n border-width: 5px;\\n border-style: solid;\\n border-color: transparent transparent black transparent;\\n }\\n }\\n\\n .range-button {\\n display: inline-block;\\n cursor: pointer;\\n padding: 4px 8px;\\n @if ($range-selection-button-border == null) {\\n margin-left: 6px;\\n } @else {\\n margin-left: 4px;\\n }\\n\\n border-radius: 2px;\\n background: $range-selection-button-color;\\n border: $range-selection-button-border;\\n\\n &.range-button-selected {\\n color: $range-selection-text-selected-color;\\n background: $range-selection-button-selected-color;\\n border: $range-selection-selected-button-border;\\n }\\n\\n &.range-button-disabled, &.range-button-selected.range-button-disabled {\\n cursor: not-allowed;\\n color: $range-selection-text-color-faded;\\n background: $range-selection-button-color-faded;\\n }\\n\\n .icon-container {\\n position: relative;\\n width: 0;\\n\\n &.icon-container-narrow {\\n svg {\\n left: -3px;\\n }\\n }\\n\\n &.icon-container-square {\\n width: 5px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &.icon-container-448 {\\n width: 3px;\\n\\n svg {\\n left: -5px;\\n }\\n }\\n\\n &:before {\\n content: 'A';\\n opacity: 0;\\n }\\n\\n svg {\\n height: 15px;\\n position: absolute;\\n top: -1px;\\n left: -4px;\\n }\\n }\\n }\\n\\n .range-selection-history + .range-selection-history {\\n margin-right: 8px;\\n margin-left: 4px;\\n }\\n\\n .percentile-button {\\n & > div {\\n display: inline-block;\\n }\\n\\n input {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 8px 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n width: 20px;\\n font-size: 11px;\\n -moz-appearance: textfield;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n\\n &::-webkit-outer-spin-button,\\n &::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n }\\n }\\n\\n .icon-container.icon-container-narrow {\\n svg {\\n height: 12px;\\n top: 1px;\\n left: -5px;\\n }\\n }\\n }\\n\\n .showing-options-button {\\n margin-right: 8px;\\n }\\n }\\n }\\n\\n .grapher-main-row {\\n display: flex;\\n\\n .central-container {\\n width: 100%;\\n }\\n }\\n\\n .range-graph-container {\\n display: flex;\\n }\\n\\n .graph-body {\\n width: 100%;\\n height: $primary-graph-body-height;\\n position: relative;\\n\\n canvas {\\n width: 100%;\\n height: 100%;\\n }\\n\\n .grapher-tooltip, .grapher-draggable-points, .grapher-vertical-lines {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 20;\\n\\n > svg {\\n position: absolute;\\n overflow: visible;\\n left: 0;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n pointer-events: none;\\n user-select: none;\\n }\\n\\n .grapher-tooltip {\\n .tooltip-item {\\n path {\\n fill: $tooltip-background-color;\\n }\\n\\n text {\\n fill: $tooltip-text-color;\\n dominant-baseline: hanging;\\n text-anchor: start;\\n }\\n\\n &.tooltip-item-fixed {\\n path {\\n fill: rgba($tooltip-background-color, 1);\\n }\\n }\\n }\\n\\n .line {\\n position: absolute;\\n height: 400px;\\n border-left: 1px solid $tooltip-line-color;\\n }\\n\\n .custom-tooltip-container {\\n position: absolute;\\n }\\n }\\n\\n .grapher-context-menu {\\n position: absolute;\\n top: 0;\\n left: 0;\\n .menu-item {\\n\\n .menu-text {\\n user-select: all;\\n position: absolute;\\n top: 0;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n max-width: max-content;\\n width: 200px;\\n }\\n }\\n }\\n\\n .grapher-draggable-points {\\n circle {\\n cursor: pointer;\\n }\\n }\\n\\n .grapher-vertical-lines {\\n line {\\n stroke: $vertical-line-color;\\n }\\n\\n polygon {\\n fill: $vertical-line-color;\\n }\\n }\\n\\n .grapher-annotations {\\n position: absolute;\\n top: 0;\\n pointer-events: none;\\n user-select: none;\\n z-index: 10;\\n\\n .grapher-annotation {\\n position: absolute;\\n\\n .annotation-marker {\\n display: inline-block;\\n background: $annotation-background-color;\\n }\\n\\n &.grapher-annotation-range {\\n .annotation-range-marker {\\n display: inline-block;\\n background-color: rgba(128, 128, 128, 0.2);\\n background-image: repeating-linear-gradient(53deg, #626266, #626266 1px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.1) 4px);\\n background-size: 40px 40px;\\n border-right: 1px solid white;\\n border-left: 1px solid white;\\n }\\n }\\n\\n .annotation-text {\\n position: absolute;\\n background: $tooltip-background-color;\\n border: 1px solid $annotation-background-color;\\n color: $tooltip-text-color;\\n padding: 2px 4px;\\n white-space: nowrap;\\n font-size: 10px;\\n z-index: 10;\\n }\\n }\\n }\\n\\n .bounds-selection {\\n position: absolute;\\n background: $range-graph-selection-range-color;\\n }\\n }\\n\\n .axis {\\n overflow: visible;\\n user-select: none;\\n\\n &.x-axis {\\n width: 1px;\\n height: $x-axis-height;\\n display: block;\\n\\n .axis-item {\\n text {\\n text-anchor: middle;\\n }\\n\\n &.axis-item-first {\\n text {\\n text-anchor: start;\\n }\\n }\\n\\n &.axis-item-last {\\n text {\\n text-anchor: end;\\n }\\n }\\n }\\n }\\n\\n &.y-axis {\\n height: $primary-graph-body-height;\\n\\n .axis-item text {\\n text-anchor: end;\\n alignment-baseline: middle;\\n }\\n\\n .y-axis-label {\\n text-anchor: middle;\\n fill: $axis-text-color;\\n\\n &.y-axis-big-label {\\n font-size: 18px;\\n }\\n }\\n\\n .series-color-box {\\n cursor: pointer;\\n }\\n\\n &.y-axis-right {\\n .axis-item text {\\n text-anchor: start;\\n }\\n }\\n }\\n\\n .axis-line {\\n stroke: $axis-line-color;\\n stroke-width: $axis-line-width;\\n }\\n\\n .axis-line-shadow {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n .axis-item {\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n\\n text {\\n fill: $axis-text-color;\\n font-size: 8px;\\n }\\n\\n &.axis-item-major {\\n .axis-tick {\\n stroke-width: 2px;\\n }\\n }\\n\\n &.axis-item-big-labels {\\n text {\\n font-size: 16px;\\n }\\n }\\n }\\n }\\n\\n .range-selection-graph {\\n width: 100%;\\n padding-bottom: $range-graph-selection-bar-size;\\n\\n .graph-body-secondary {\\n height: $secondary-graph-body-height;\\n\\n svg {\\n position: absolute;\\n left: 0;\\n height: $secondary-graph-body-height;\\n width: 100%;\\n overflow: visible;\\n\\n .target-selection {\\n fill: $range-graph-selection-range-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar {\\n fill: $range-graph-selection-bar-color;\\n cursor: ew-resize;\\n }\\n\\n .selection-bar-track {\\n fill: $range-graph-selection-bar-track-color;\\n }\\n\\n .selection-bar-rifles {\\n fill: none;\\n stroke-width: 1;\\n stroke: $range-graph-selection-bar-rifles-color;\\n }\\n\\n .selection-bar-handle {\\n stroke: $range-graph-handle-color;\\n stroke-width: 1;\\n fill: $range-graph-handle-fill-color;\\n cursor: ew-resize;\\n }\\n\\n .target-selection-outline {\\n stroke: $range-graph-selection-outline-color;\\n fill: none;\\n }\\n\\n .axis-item {\\n text {\\n fill: $range-graph-axis-text-color;\\n text-anchor: start;\\n font-size: 8px;\\n user-select: none;\\n dominant-baseline: text-after-edge;\\n }\\n\\n path {\\n stroke: $axis-tick-color;\\n stroke-width: 1px;\\n }\\n }\\n }\\n }\\n }\\n\\n input, textarea {\\n background: transparent;\\n border: 1px solid $series-key-input-border-color;\\n margin: 2px 0;\\n color: $series-key-input-text-color;\\n padding: 1px 2px;\\n text-align: center;\\n\\n &:focus {\\n outline: none;\\n border-color: $series-key-input-selected-border-color;\\n }\\n }\\n\\n &.grapher-dragging-y {\\n .y-axis {\\n border: 2px dashed silver;\\n margin: -2px;\\n flex-shrink: 0;\\n\\n & + .y-axis {\\n border-left: none;\\n }\\n }\\n }\\n\\n &.grapher-fullscreen {\\n height: calc(100vh - 2*#{$padding});\\n }\\n\\n &.grapher-fixed-height {\\n .grapher-primary-container-outer {\\n height: 100%;\\n\\n .grapher-primary-container-body {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n\\n .grapher-main-row {\\n flex-grow: 1;\\n\\n .central-container {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n\\n > .graph-body {\\n flex-grow: 1;\\n height: unset;\\n }\\n }\\n\\n .axis.y-axis {\\n height: calc(100% - #{2*$x-axis-height});\\n }\\n }\\n }\\n }\\n }\\n\\n &.new-grapher {\\n height: auto;\\n border: 2px dashed silver;\\n text-align: center;\\n color: $new-grapher-color;\\n }\\n}\\n\\n@mixin grapher-theme-night (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height\\n );\\n}\\n\\n@mixin grapher-theme-day (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: #656565,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: invert(#E0E0E3),\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n@mixin grapher-theme-export (\\n $primary-graph-body-height: 400px,\\n $secondary-graph-body-height: 50px,\\n) {\\n @include grapher(\\n $primary-graph-body-height,\\n $secondary-graph-body-height,\\n\\n $background-color-1: #FFF,\\n $background-color-2: #FFF,\\n\\n $tooltip-line-color: invert(#CCC),\\n $tooltip-background-color: invert(rgba(0, 0, 0, 0.6)),\\n $tooltip-text-color: invert(#F0F0F0),\\n $vertical-line-color: invert(#CCC),\\n\\n $axis-line-color: black,\\n $axis-line-width: 1px,\\n $axis-tick-color: #BFBFBF,\\n $axis-text-color: black,\\n\\n $range-selection-text-color: #444,\\n $range-selection-button-color: white,\\n $range-selection-button-selected-color: white,\\n $range-selection-text-selected-color: black,\\n $range-selection-text-color-faded: #888,\\n $range-selection-button-color-faded: #EEE,\\n $range-selection-button-border: 1px dotted silver,\\n $range-selection-selected-button-border: 1px solid black,\\n\\n $range-graph-selection-range-color: rgba(0, 0, 0, 0.02),\\n $range-graph-selection-outline-color: #333,\\n $range-graph-selection-bar-color: #B0B0B7,\\n $range-graph-selection-bar-track-color: #EEE,\\n $range-graph-selection-bar-rifles-color: #333,\\n $range-graph-handle-color: #333,\\n $range-graph-handle-fill-color: #B0B0B7,\\n\\n $annotation-background-color: rgba(0, 0, 0, 0.3),\\n\\n $series-key-axis-container-color: #B0B0B7,\\n $series-key-input-border-color: #E0E0E3,\\n $series-key-input-selected-border-color: #505053,\\n $series-key-input-text-color: #222,\\n $series-key-background: null,\\n $series-key-shadow-color: black,\\n $scale-label-color: black,\\n\\n $title-color: black,\\n\\n $sidebar-background-color: #EEE,\\n $sidebar-text-color: #111,\\n\\n $new-grapher-color: #222\\n );\\n}\\n\\n.grapher-night {\\n @include grapher-theme-night();\\n}\\n\\n.grapher-day {\\n @include grapher-theme-day();\\n}\\n\\n.grapher-export {\\n @include grapher-theme-export();\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\n\\nvoid main() {\\n gl_FragColor = vec4(color);\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\n\\nvoid main() {\\n gl_Position = vec4((position - 0.5)*2.0, 0.0, 1.0);\\n}\\n\"","module.exports = \"#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\nprecision mediump float;\\n\\nuniform vec4 color;\\n\\n// Adapted and modified from https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl/\\nvoid main() {\\n float delta = 0.0;\\n float alpha = 1.0;\\n vec2 center = 2.0 * gl_PointCoord - 1.0;\\n float r = dot(center, center);\\n\\n if (r > 1.0) {\\n discard;\\n }\\n\\n #ifdef GL_OES_standard_derivatives\\n delta = fwidth(r);\\n alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\\n #endif\\n\\n gl_FragColor = color * alpha;\\n}\\n\"","module.exports = \"precision mediump float;\\n\\nattribute vec2 position;\\n\\nuniform float width;\\nuniform float height;\\nuniform float pointSize;\\n\\nvoid main() {\\n gl_Position = vec4(2.0*position.x/width - 1.0, 1.0 - 2.0*position.y/height, 0.0, 1.0);\\n gl_PointSize = pointSize;\\n}\"","module.exports = \"precision highp float;\\n\\nuniform vec4 color;\\nuniform float thickness;\\nuniform float shadowBlur;\\nuniform vec4 shadowColor;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\n/**\\n * Calculate distance between point and line in screen space (ie, inputs in pixels, returns distance in pixels)\\n */\\nfloat distance_from_line() {\\n float x0 = gl_FragCoord.x;\\n float y0 = gl_FragCoord.y;\\n\\n // let line be defined by ax + by + c = 0;\\n float a, b, c;\\n\\n if (position_vec.x == prev_position_vec.x) {\\n a = 1.0;\\n b = 0.0;\\n c = -position_vec.x;\\n } else {\\n float slope = (position_vec.y - prev_position_vec.y)/(position_vec.x - prev_position_vec.x);\\n float y_intercept = position_vec.y - slope*position_vec.x;\\n\\n // y = slope*x + y_intercept\\n // (-slope)(x) + (1)(y) - y_intercept = 0;\\n a = -slope;\\n b = 1.0;\\n c = -y_intercept;\\n }\\n\\n return abs(a*x0 + b*y0 + c)/length(vec2(a, b));\\n}\\n\\nvoid main() {\\n vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\n float dist = distance_from_line();\\n\\n if (dist + shadowBlur >= thickness) {\\n float percent_shadowed = ((thickness - dist) / shadowBlur);\\n gl_FragColor = mix(transparent, shadowColor, percent_shadowed*percent_shadowed);\\n } else {\\n gl_FragColor = vec4(color);\\n gl_FragColor.rgb *= gl_FragColor.a;\\n }\\n}\\n\"","module.exports = \"precision highp float;\\n\\nattribute vec2 position;\\nattribute vec2 prevPosition;\\nattribute float vertex;\\n\\nuniform float width;\\nuniform float height;\\nuniform float thickness;\\n\\nvarying vec2 position_vec;\\nvarying vec2 prev_position_vec;\\n\\nvoid main() {\\n vec2 delta = position - prevPosition;\\n vec2 alpha = prevPosition;\\n vec2 beta = position;\\n\\n vec2 normalized_delta = normalize(delta);\\n vec2 normal = vec2(-thickness/2.0 * normalized_delta.y, thickness/2.0 * normalized_delta.x);\\n\\n vec2 vertex_position =\\n step(0.5, mod(vertex, 2.0))*alpha + // alpha if vertex is odd, 0 otherwise\\n step(0.5, mod(vertex + 1.0, 2.0))*beta + // beta if vertex is even, 0 otherwise\\n 2.0*(step(1.5, vertex)-0.5)*normal // -normal if vertex < 2, +normal otherwise\\n ;\\n\\n position_vec = vec2(position.x, height - position.y);\\n prev_position_vec = vec2(prevPosition.x, height - prevPosition.y);\\n\\n gl_Position = vec4(2.0*vertex_position.x/width - 1.0, 1.0 - 2.0*vertex_position.y/height, 0.0, 1.0);\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".bundle.cjs\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/assets/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunkGrapher\"] = globalThis[\"webpackChunkGrapher\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","export const SIMPLE_DATA_TYPES = [\n 'values',\n 'tuples',\n 'objects'\n];\n\nexport const COMPLEX_DATA_TYPES = [\n 'tuple_observable',\n 'object_observable',\n 'generator'\n];\n\nexport const DATA_TYPES = [...SIMPLE_DATA_TYPES, ...COMPLEX_DATA_TYPES];\n","import PropTypes from 'prop-types';\nimport {DATA_TYPES} from '../state/data_types';\n\n// checking the shape of data is slow if there's a lot of it\n// it can be convenient in development, but should not be done when testing high cardinality data\nconst ENABLE_DATA_CHECK = false;\n\nconst PointY = function (props, propName) {\n if (typeof props[propName] !== 'number' && props[propName] !== null) {\n return new Error(`${propName} needs to be a number or null`);\n }\n\n return null;\n};\n\nconst PointTuple = function (props, propName) {\n if (!Array.isArray(props) || props.length !== 2) { // eslint-disable-line react/prop-types\n return new Error(`${propName} needs to be an array of length two`);\n }\n\n const [x, y] = props;\n if (typeof x !== 'number' && !(x instanceof Date)) {\n return new Error(`${propName}.x needs to be a number or date`);\n }\n\n if (typeof y !== 'number' && y !== null) {\n return new Error(`${propName}.y needs to be a number or null`);\n }\n\n return null;\n};\n\nconst Data = ENABLE_DATA_CHECK ? PropTypes.oneOfType([\n PropTypes.arrayOf(PointY), // values\n PropTypes.arrayOf(PropTypes.arrayOf(PointTuple)), // tuples\n PropTypes.arrayOf(PropTypes.object), // objects\n PropTypes.shape({ observe: PropTypes.func.isRequired }), // observable\n PropTypes.func // generator function\n]) : PropTypes.any;\n\nconst SingleSeries = PropTypes.shape({\n data: Data.isRequired,\n type: PropTypes.oneOf([\n ...DATA_TYPES,\n 'infer'\n ]),\n xKey: PropTypes.string,\n yKey: PropTypes.string,\n xUnixDates: PropTypes.bool,\n color: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n name: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.string,\n ignoreDiscontinuities: PropTypes.bool,\n dashed: PropTypes.bool,\n dashPattern: PropTypes.arrayOf(PropTypes.number),\n width: PropTypes.number,\n rangeSelectorWidth: PropTypes.number,\n axis: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n expandYWith: PropTypes.arrayOf(PropTypes.number),\n defaultAlwaysTooltipped: PropTypes.bool,\n square: PropTypes.bool,\n shiftXBy: PropTypes.number,\n graph: PropTypes.number, // affects multigrapher only\n background: PropTypes.object,\n hideFromKey: PropTypes.bool,\n showIndividualPoints: PropTypes.bool,\n rendering: PropTypes.oneOf(['line', 'bar', 'area']), // defaults to line\n negativeColor: PropTypes.string, // only applies to bar\n gradient: PropTypes.array, // only applies to area\n zeroLineWidth: PropTypes.number, // only applies to bar and area\n zeroLineColor: PropTypes.string, // only applies to bar and area\n zeroLineY: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // only applies to bar and area\n pointRadius: PropTypes.number, // only applies to area\n tooltipWidth: PropTypes.number,\n hasAreaBottom: PropTypes.bool,\n shadowColor: PropTypes.string,\n rangeKey: PropTypes.string\n});\n\nconst Series = PropTypes.arrayOf(SingleSeries);\n\nconst Axis = PropTypes.shape({\n axisIndex: PropTypes.number.isRequired,\n series: PropTypes.array.isRequired,\n side: PropTypes.oneOf(['left', 'right']).isRequired,\n scale: PropTypes.oneOf(['linear', 'log']).isRequired,\n label: PropTypes.string\n});\n\nconst Axes = PropTypes.arrayOf(Axis);\n\nconst CustomBoundsSelector = PropTypes.shape({\n label: PropTypes.string.isRequired,\n calculator: PropTypes.func.isRequired,\n datesOnly: PropTypes.bool\n});\n\nconst CustomBoundsSelectors = PropTypes.arrayOf(CustomBoundsSelector);\n\nconst TooltipOptionsRaw = {\n includeSeriesLabel: PropTypes.bool,\n includeXLabel: PropTypes.bool,\n includeYLabel: PropTypes.bool,\n includeXValue: PropTypes.bool,\n includeYValue: PropTypes.bool,\n floating: PropTypes.bool,\n alwaysFixedPosition: PropTypes.bool,\n floatPosition: PropTypes.oneOf(['top', 'bottom']),\n floatDelta: PropTypes.number,\n savingDisabled: PropTypes.bool,\n customTooltip: PropTypes.func,\n combineTooltips: PropTypes.oneOfType([PropTypes.bool, PropTypes.number])\n};\n\nconst TooltipOptions = PropTypes.shape(TooltipOptionsRaw);\n\nconst Annotation = PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n startX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n endX: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.instanceOf(Date)]),\n series: PropTypes.arrayOf(PropTypes.string),\n content: PropTypes.string,\n lineOnly: PropTypes.bool\n});\nconst Annotations = PropTypes.arrayOf(Annotation);\n\nconst DraggablePoint = PropTypes.shape({\n x: PropTypes.number.isRequired,\n y: PropTypes.number.isRequired,\n radius: PropTypes.number,\n fillColor: PropTypes.string,\n strokeColor: PropTypes.string,\n strokeWidth: PropTypes.number,\n onClick: PropTypes.func,\n onDoubleClick: PropTypes.func\n});\nconst DraggablePoints = PropTypes.arrayOf(DraggablePoint);\n\nconst VerticalLine = PropTypes.shape({\n x: PropTypes.number.isRequired,\n color: PropTypes.string,\n lineTop: PropTypes.number,\n width: PropTypes.number,\n markTop: PropTypes.bool,\n style: PropTypes.object,\n markerStyle: PropTypes.object,\n text: PropTypes.string,\n textTop: PropTypes.number,\n textStyle: PropTypes.object,\n minPixelX: PropTypes.number,\n maxPixelX: PropTypes.number,\n onRangeGraph: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.object // anything that can be passed into the overall vertical line\n ]),\n onRangeGraphOnly: PropTypes.bool\n});\nconst VerticalLines = PropTypes.arrayOf(VerticalLine);\n\nconst CustomPropTypes = {\n Data,\n SingleSeries,\n Series,\n Axis,\n Axes,\n CustomBoundsSelector,\n CustomBoundsSelectors,\n TooltipOptions,\n TooltipOptionsRaw,\n Annotations,\n DraggablePoint,\n DraggablePoints,\n VerticalLine,\n VerticalLines\n};\n\n\nexport default CustomPropTypes;\n","export const DPI_INCREASE = 2;\n\n/**\n * Sizes the canvas such that rendering is pixel perfect\n * Returns the sizing information\n *\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} context\n * @param {Boolean} reset - if true, will reset the canvas size before checking sizing\n * @return {Promise<{boundingRect: DOMRect, pixelRatio: number, elementHeight: number, renderWidth: number, renderHeight: number, elementWidth: number}>}\n */\nexport default async function sizeCanvas(canvas, context, {reset=true}={}) {\n if (reset) {\n canvas.width = '';\n canvas.height = '';\n canvas.style.width = '0';\n canvas.style.height = '';\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n let boundingRect = canvas.parentNode.getBoundingClientRect();\n\n while (boundingRect.width === 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n boundingRect = canvas.getBoundingClientRect();\n }\n\n const dpr = window.devicePixelRatio || 1;\n const bsr = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n const pixelRatio = DPI_INCREASE*dpr / bsr;\n\n const elementWidth = boundingRect.width;\n const elementHeight = boundingRect.height;\n const renderWidth = elementWidth * pixelRatio;\n const renderHeight = elementHeight * pixelRatio;\n\n canvas.width = renderWidth;\n canvas.height = renderHeight;\n canvas.style.width = `${elementWidth}px`;\n canvas.style.height = `${elementHeight}px`;\n\n // We could us this to make coordinates behave as if they weren't transformed if we wanted\n // context.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0)\n\n return {\n pixelRatio,\n elementWidth,\n elementHeight,\n renderWidth,\n renderHeight,\n boundingRect\n };\n}\n","export const LINE_COLORS = [\n '#F1C232',\n '#1259f8',\n '#cb4b4b',\n '#4da74d',\n '#9440ed',\n '#61e0ed',\n '#ed6d2c',\n '#ed13c6',\n '#bbed59'\n];\n\nexport default function getColor(seriesColor, i, multigrapherSeriesIndex) {\n if (typeof seriesColor === 'string') {\n return seriesColor;\n }\n\n if (typeof seriesColor === 'number') {\n return LINE_COLORS[seriesColor % LINE_COLORS.length];\n }\n\n if (multigrapherSeriesIndex !== undefined) {\n return LINE_COLORS[multigrapherSeriesIndex % LINE_COLORS.length];\n }\n\n return LINE_COLORS[i % LINE_COLORS.length];\n}\n","/**\n * Returns the color as a [r, g, b, a] array with domain 0 to 1 for use in webgl\n *\n * @param color\n * @return {[number, number, number, number]|[number, number, number, number]}\n */\nexport default function colorToVector(color) {\n if (color === 'black') {\n color = '#000000';\n } else if (color === 'white') {\n color = '#FFFFFF';\n } else if (color === 'transparent') {\n return [0, 0, 0, 0];\n }\n\n if (color.startsWith('rgb')) {\n const parts = color.split(',').map((part) => parseFloat(part.match(/\\d+(\\.\\d+)?/)[0]));\n return [\n parts[0]/255,\n parts[1]/255,\n parts[2]/255,\n parts.length >= 4 ? parts[3] : 1\n ];\n }\n\n if (typeof color !== 'string' || !/^#[\\dA-F]{6}$/i.test(color)) {\n throw new Error(`Color must be a hex string: ${color}`);\n }\n\n const r = parseInt(color.substr(1, 2), 16)/255;\n const g = parseInt(color.substr(3, 2), 16)/255;\n const b = parseInt(color.substr(5, 2), 16)/255;\n const a = 1.0;\n return [r, g, b, a];\n}\n","import {DPI_INCREASE} from './size_canvas';\n\n/**\n * Returns an array of contiguous paths from data in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace\n * @param {Object} options\n * @param {Number} options.splitAtY - split the path whenever it's suddenly less or greater than this value\n * @return {[[Number]]}\n */\nexport default function pathsFrom(dataInRenderSpace, {splitAtY}={}) {\n const paths = [];\n let currentPath = [];\n let previouslyDiscontinuous = true;\n\n const { nullMask, maxYValues, minYValues, yValues } = dataInRenderSpace;\n\n for (let i = 0; i < yValues.length; i++) {\n const x = i*DPI_INCREASE;\n const y = yValues[i];\n\n if (nullMask[i] & 0b001) { // y null\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [];\n }\n\n previouslyDiscontinuous = true;\n continue;\n }\n\n currentPath.push([x, y]);\n\n const minY = minYValues[i];\n const maxY = maxYValues[i];\n\n if (minY !== maxY) {\n if (!(nullMask[i] & 0b010)) {\n currentPath.push([x, minY]);\n }\n\n if (!(nullMask[i] & 0b100)) {\n currentPath.push([x, maxY]);\n }\n currentPath.push([x, y]);\n }\n\n previouslyDiscontinuous = false;\n\n if (typeof splitAtY === 'number' && i > 0) {\n const prevY = yValues[i-1];\n const signFlipped = !(nullMask[i-1] & 0b001) && (prevY < splitAtY && y >= splitAtY) || (prevY > splitAtY && y <= splitAtY) || (prevY === splitAtY && y !== splitAtY);\n\n if (signFlipped) {\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n currentPath = [\n [x, y]\n ];\n }\n\n previouslyDiscontinuous = true;\n }\n }\n }\n\n if (!previouslyDiscontinuous) {\n paths.push(currentPath);\n }\n\n return paths;\n}\n","let rustApiModule;\nexport const RustAPIPromise = import('../rust/pkg/index.js').then((module) => {\n return module.default().then(() => {\n rustApiModule = module;\n });\n});\n\nexport default function RustAPI() {\n return rustApiModule;\n}\n","import pathsFrom from './paths_from';\nimport {DPI_INCREASE} from './size_canvas';\nimport RustAPI from '../state/rust_api';\n\n/**\n *\n * @param {[[Number]]} paths\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport function extractVerticesFromPaths(paths, { dashed, dashPattern }) {\n let pointNumber = 0;\n for (let path of paths) {\n if (dashed) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n pointNumber++;\n }\n } else {\n pointNumber += path.length;\n }\n }\n\n const positions = new Float32Array(pointNumber*8);\n const prevPositions = new Float32Array(pointNumber*8);\n const vertices = new Float32Array(pointNumber*4);\n const indices = new Uint32Array(pointNumber*6);\n\n if (pointNumber > 0) {\n const verticesPattern = new Float32Array([0, 1, 2, 3]);\n vertices.set(verticesPattern);\n let vertexPointer = verticesPattern.length;\n let sourceLength = verticesPattern.length;\n while (vertexPointer < vertices.length) {\n if (vertexPointer + sourceLength > vertices.length) {\n sourceLength = vertices.length - vertexPointer;\n }\n\n vertices.copyWithin(vertexPointer, 0, sourceLength);\n vertexPointer += sourceLength;\n sourceLength <<= 1;\n }\n }\n\n let pointI = 0;\n for (let path of paths) {\n for (let i = 0; i < path.length; i++) {\n if (dashed && i % (dashPattern[0] + dashPattern[1]) >= dashPattern[0]) {\n continue;\n }\n\n const [x, y] = path[i];\n\n let prevX, prevY;\n\n if (i === 0) {\n prevX = x - 1;\n prevY = y;\n } else {\n [prevX, prevY] = path[i - 1];\n }\n\n for (let j = 0; j < 4; j++) {\n positions[pointI * 8 + 2 * j] = x;\n positions[pointI * 8 + 2 * j + 1] = y;\n prevPositions[pointI * 8 + 2 * j] = prevX;\n prevPositions[pointI * 8 + 2 * j + 1] = prevY;\n }\n\n indices[pointI * 6] = pointI * 4;\n indices[pointI * 6 + 1] = pointI * 4 + 1;\n indices[pointI * 6 + 2] = pointI * 4 + 3;\n\n indices[pointI * 6 + 3] = pointI * 4;\n indices[pointI * 6 + 4] = pointI * 4 + 2;\n indices[pointI * 6 + 5] = pointI * 4 + 3;\n\n pointI++;\n }\n }\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n\n/**\n * Takes the paths and turns them into what's needed for the line webgl program\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, paths?: [[Number]]}} dataInRenderSpace\n * @param {Boolean} dashed\n * @param {Array} dashPattern\n * @return {{prevPositions: Float32Array, indices: Uint32Array, vertices: Float32Array, positions: Float32Array}}\n */\nexport default function extractVertices(dataInRenderSpace, { dashed, dashPattern }) {\n if (dataInRenderSpace.paths) {\n return extractVerticesFromPaths(dataInRenderSpace.paths, { dashed, dashPattern});\n }\n\n if (!RustAPI()) {\n const paths = pathsFrom(dataInRenderSpace);\n return extractVerticesFromPaths(paths, { dashed, dashPattern});\n }\n\n const pointNumber = RustAPI().get_point_number(\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n let positions = new Float32Array(pointNumber*8);\n let prevPositions = new Float32Array(pointNumber*8);\n let vertices = new Float32Array(pointNumber*4);\n let indices = new Uint32Array(pointNumber*6);\n\n RustAPI().extract_vertices(\n DPI_INCREASE,\n dataInRenderSpace.nullMask, dataInRenderSpace.yValues, dataInRenderSpace.minYValues, dataInRenderSpace.maxYValues,\n positions, prevPositions, vertices, indices,\n dashed, dashPattern[0], dashPattern[1]\n );\n\n return {\n positions,\n prevPositions,\n vertices,\n indices\n };\n}\n","/**\n * Creates a webgl program, linking the shaders and checking for errors\n *\n * @param gl\n * @param vertShaderSource\n * @param fragShaderSource\n * @return {WebGLProgram}\n */\nexport default function createGLProgram(gl, vertShaderSource, fragShaderSource) {\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertShaderSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(vertexShader)); // eslint-disable-line no-console\n }\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragShaderSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(fragmentShader)); // eslint-disable-line no-console\n }\n\n const program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n gl.validateProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program)); // eslint-disable-line no-console\n }\n\n return program;\n}\n","import lineFrag from './line.frag';\nimport lineVert from './line.vert';\nimport circleFrag from './circle.frag';\nimport circleVert from './circle.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport extractVertices from './extract_vertices';\nimport createGLProgram from './create_gl_program';\nimport {DPI_INCREASE} from './size_canvas';\n\nexport default class LineProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, lineVert, lineFrag);\n this._circleProgram = createGLProgram(gl, circleVert, circleFrag);\n\n this._positionBuffer = gl.createBuffer();\n this._prevPositionBuffer = gl.createBuffer();\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n this._individualPointBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n dispose() {\n\n }\n\n clear() {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, width, height);\n }\n\n /**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} parameters - set of options\n * @param {String} parameters.color - color of the line to draw\n * @param {Number} [parameters.width] - line width\n * @param {Number} [parameters.shadowBlur] - level to blur shadow to\n * @param {String} [parameters.shadowColor] - color of the shadow\n * @param {String} [parameters.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [parameters.dashPattern] - dash array for the canvas\n * @param {Boolean} [parameters.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [parameters.showIndividualPoints] - draw circles at each point\n * @param {Function} [parameters.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @private\n */\n draw(dataInRenderSpace, parameters) {\n const gl = this._gl;\n const width = gl.drawingBufferWidth;\n const height = gl.drawingBufferHeight;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n const thickness = DPI_INCREASE*((parameters.width || 1) + (parameters.highlighted ? 2 : 0));\n const shadowBlur = parameters.shadowBlur === undefined ? 2 : parameters.shadowBlur;\n const shadowColor = parameters.shadowColor || 'black';\n const dashed = parameters.dashed || false;\n const dashPattern = parameters.dashPattern || [5, 5];\n\n const {positions, prevPositions, vertices, indices} = extractVertices(dataInRenderSpace, { dashed, dashPattern });\n\n const positionIndex = gl.getAttribLocation(this._program, 'position');\n const prevPositionIndex = gl.getAttribLocation(this._program, 'prevPosition');\n const vertexIndex = gl.getAttribLocation(this._program, 'vertex');\n\n gl.enableVertexAttribArray(positionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(positionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(prevPositionIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._prevPositionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, prevPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(prevPositionIndex, 2, gl.FLOAT, false, 0, 0);\n\n gl.enableVertexAttribArray(vertexIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.vertexAttribPointer(vertexIndex, 1, gl.FLOAT, false, 0, 0);\n\n gl.uniform1f(gl.getUniformLocation(this._program, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._program, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._program, 'thickness'), Math.max(thickness, 1)+shadowBlur);\n gl.uniform1f(gl.getUniformLocation(this._program, 'shadowBlur'), shadowBlur);\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(parameters.color));\n gl.uniform4f(gl.getUniformLocation(this._program, 'shadowColor'), ...colorToVector(shadowColor));\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_INT, 0);\n\n if (parameters.showIndividualPoints) {\n gl.useProgram(this._circleProgram);\n\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'width'), width);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'height'), height);\n gl.uniform1f(gl.getUniformLocation(this._circleProgram, 'pointSize'), 2*(thickness+6));\n gl.uniform4f(gl.getUniformLocation(this._circleProgram, 'color'), ...colorToVector(parameters.color));\n\n const individualPoints = parameters.getIndividualPoints();\n\n gl.enableVertexAttribArray(0);\n gl.bindBuffer(gl.ARRAY_BUFFER, this._individualPointBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(individualPoints.flat()), gl.STATIC_DRAW);\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.POINTS, 0, individualPoints.length);\n }\n }\n\n}\n","export default class Eventable {\n\n constructor() {\n this._listeners = {};\n }\n\n /**\n * Clears all listeners\n * @protected\n */\n clearListeners() {\n this._listeners = {};\n }\n\n /**\n * Create a new listener for the event\n * When the event is emitted, it will call the provided function\n *\n * @param {String|symbol} eventName - the name of the event to start listening to\n * @param {Function} fn - the listener to add\n */\n on(eventName, fn) {\n this._listeners[eventName] = this._listeners[eventName] || new Set();\n this._listeners[eventName].add(fn);\n }\n\n /**\n * Removes an existing listener for the event\n *\n * @param {String|symbol} eventName - the name of the event to stop listening to\n * @param {Function} fn - the listener to remove\n */\n off(eventName, fn) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n this._listeners[eventName].delete(fn);\n\n if (this._listeners[eventName].size === 0) {\n delete this._listeners[eventName];\n }\n }\n\n /**\n * Emits an event that will go out to all _listeners on eventName\n *\n * @param {String|symbol} eventName - the name of the event to emit\n */\n emit(eventName) {\n if (!this._listeners[eventName]) {\n return;\n }\n\n const args = [];\n for (let i = 1; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn.apply(this, args);\n });\n }\n\n}\n","import backgroundFrag from './background.frag';\nimport backgroundVert from './background.vert';\nimport colorToVector from '../helpers/color_to_vector';\nimport createGLProgram from './create_gl_program';\n\nexport default class BackgroundProgram {\n\n constructor(gl) {\n this._gl = gl;\n\n this._program = createGLProgram(gl, backgroundVert, backgroundFrag);\n\n this._vertexBuffer = gl.createBuffer();\n this._indexBuffer = gl.createBuffer();\n\n if (!gl.getExtension('OES_element_index_uint')) {\n console.error('Your browser does not support OES_element_index_uint'); // eslint-disable-line no-console\n }\n }\n\n draw({ data }) {\n const gl = this._gl;\n gl.useProgram(this._program);\n\n // gl.disable(gl.DEPTH_TEST);\n\n for (let { minXt, maxXt, color } of data) {\n gl.uniform4f(gl.getUniformLocation(this._program, 'color'), ...colorToVector(color));\n\n const vertices = new Float32Array([\n minXt, 1, maxXt, 1, maxXt, -1,\n minXt, 1, maxXt, -1, minXt, -1\n ]);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this._program, 'position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n }\n\n}\n","/**\n * Draws a horizontal line at the specified y-coordinate.\n *\n * @param {Number} y\n * @param {Object} options\n * @param {CanvasRenderingContext2D} options.context\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing\n * @param {String} options.color\n * @param {String} options.zeroColor\n * @param {Number} options.zeroWidth\n */\nexport function drawZeroLine(y, { context, sizing, color, zeroColor, zeroWidth}) {\n if (!zeroWidth) {\n return;\n }\n\n context.strokeStyle = zeroColor || color;\n context.lineWidth = zeroWidth;\n\n context.beginPath();\n context.moveTo(0, y);\n context.lineTo(sizing.renderWidth, y);\n context.stroke();\n}\n","import {drawZeroLine} from './draw_zero_line';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.indexInAxis - index of the series in the axis\n * @param {Number} options.axisSeriesCount - number of series in the axis\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {String} options.negativeColor - color of the bar to draw if negative\n * @param {String} options.zeroColor - color of the zero line\n * @param {Number} options.zeroWidth - width of the zero line\n * @param {Number} options.closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} options.bounds - bounds of the data as rendered\n * @private\n */\nexport default function drawBars(individualPoints, {\n color, context, sizing, indexInAxis, axisSeriesCount, zero, hasNegatives, negativeColor, zeroColor, zeroWidth, closestSpacing, bounds\n}) {\n context.strokeStyle = color;\n context.fillStyle = color;\n\n const {barWidth, totalBarWidth} = getBarWidths({ closestSpacing, bounds, sizing, axisSeriesCount });\n const barBottom = hasNegatives ? zero : sizing.renderHeight;\n\n for (let i = 0; i < individualPoints.length; i++) {\n const [x, y] = individualPoints[i];\n\n if (hasNegatives) {\n if (y <= zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.fillRect(x - totalBarWidth / 2 + barWidth*indexInAxis, y, barWidth, barBottom-y);\n }\n\n if (zeroWidth) {\n drawZeroLine(barBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n}\n\n/**\n * Calculates the widths of the bars\n *\n * @param {Number} closestSpacing - closest x spacing between points, in data space\n * @param {{minX: Number, maxX: Number}} bounds - bounds of the data as rendered\n * @param {{renderWidth: Number, renderHeight: Number}} sizing - size of the canvas, in pixels\n * @param {Number} axisSeriesCount - number of series in the axis\n * @return {{barWidth: Number, totalBarWidth: Number, barSpacing: Number}}\n */\nexport function getBarWidths({closestSpacing, bounds, sizing, axisSeriesCount}) {\n // width of bar plus spacing, which we define as the closest distance between points in pixel space\n const fullBarWidth = closestSpacing / (bounds.maxX - bounds.minX) * sizing.renderWidth;\n\n const totalBarWidth = fullBarWidth * 0.8;\n const barSpacing = fullBarWidth * 0.2;\n const barWidth = totalBarWidth / axisSeriesCount;\n\n return {\n barWidth,\n totalBarWidth,\n barSpacing\n };\n}\n","import {extractYValue} from '../helpers/flatten_simple_data.js';\n\n/**\n * Given a series object, figures out the form of the data\n * Note that this is not a validator, nor is it guaranteed to get it right 100% of the time!\n * If it is giving the wrong type, it is recommended to specify the type manually\n *\n * @param {*} series\n * @param {Boolean} options.useSimpleData\n * @param {Array} options.data\n * @return {String}\n */\nexport default function inferType(series, options={ useSimpleData: false }) {\n if (series.type && series.type !== 'infer') {\n return series.type;\n }\n\n const data = options.data || (options.useSimpleData ? (series.simpleData || series.data) : series.data);\n\n if (!data) {\n throw new Error('Data must be provided');\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'tuples';\n }\n\n if (Array.isArray(data[0])) {\n return 'tuples';\n }\n\n if (typeof data[0] === 'number' || !data[0]) {\n return 'values';\n }\n\n return 'objects';\n }\n\n if (data.observe) {\n if (series.xKey) {\n return 'object_observable';\n } else {\n return 'tuple_observable';\n }\n }\n\n if (typeof data === 'function') {\n return 'generator';\n }\n\n throw new Error('Could not infer type');\n}\n\n/**\n *\n * @param simpleData\n * @param singleSeries\n * @return {boolean}\n */\nexport function isEnumLike(simpleData, singleSeries) {\n for (let i = 0; i < simpleData.length; i++) {\n const y = extractYValue(simpleData[simpleData.length - 1], singleSeries);\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof y === 'string') {\n return true;\n }\n }\n\n return false;\n}\n","import sizeCanvas from './size_canvas';\nimport getColor from '../helpers/colors';\nimport LineProgram from './line_program';\nimport drawLine from './draw_line';\nimport Eventable from '../eventable';\nimport drawBackground from './draw_background.js';\nimport BackgroundProgram from './background_program.js';\nimport drawBars from './draw_bars';\nimport drawArea from './draw_area';\nimport inferType from '../state/infer_type';\n\nexport default class GraphBodyRenderer extends Eventable {\n\n constructor({stateController, canvasElement, webgl=false, checkIntersection=true }) {\n super();\n\n this._stateController = stateController;\n\n this._checkIntersection = checkIntersection;\n this._canvas = canvasElement;\n this._webgl = webgl;\n if (webgl) {\n this._context = this._canvas.getContext('webgl');\n if (this._context) {\n this._lineProgram = new LineProgram(this._context);\n } else {\n alert('WebGL failed! Attempting fallback to CPU rendering');\n this._webgl = false;\n }\n }\n\n if (!this._webgl) {\n this._context = this._canvas.getContext( '2d');\n this._context2d = this._context;\n }\n\n this._initialized = this._initializeCanvas();\n\n this._boundResize = this.resize.bind(this);\n this._cachedAxisCount = null;\n this._onAxisChange = (axes) => {\n const count = axes.filter(({ series }) => series.length > 0).length;\n if (this._cachedAxisCount !== count) {\n this._cachedAxisCount = count;\n this.resize();\n }\n };\n\n stateController.on('axes_changed', this._onAxisChange);\n stateController.on('dragging_y_changed', this._boundResize);\n stateController.on('showing_sidebar_changed', this._boundResize);\n }\n\n /**\n * Cleans up after this renderer\n */\n dispose() {\n this.clearListeners();\n this._lineProgram && this._lineProgram.dispose();\n this._cachedAxisCount = null;\n this._stateController.off('axes_changed', this._onAxisChange);\n this._stateController.off('dragging_y_changed', this._boundResize);\n\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n }\n }\n\n clear() {\n if (this._webgl) {\n this._lineProgram.clear();\n } else {\n this._context.clearRect(0, 0, this._context.canvas.width, this._context.canvas.height);\n }\n }\n\n render(singleSeries, inRenderSpace, { highlighted, showIndividualPoints, shadowColor, shadowBlur, width, defaultLineWidth, bounds, globalBounds, inRenderSpaceAreaBottom }) {\n const getIndividualPoints = (useDataSpace) => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const individualPoints = [];\n let data = singleSeries.inSelectedSpace.data;\n if (useDataSpace) {\n data = singleSeries.inDataSpace;\n }\n\n for (let [x, y] of data) {\n if (y === null) {\n continue;\n }\n\n individualPoints.push([\n (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n (1.0 - (y - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight\n ]);\n }\n\n return individualPoints;\n };\n\n const getRanges = () => {\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n if (!singleSeries.rangeKey) {\n return [];\n }\n\n const inferredType = inferType(singleSeries, { useSimpleData: true });\n if (inferredType !== 'objects') {\n return [];\n }\n\n return (singleSeries.simpleData || singleSeries.data).map((object) => {\n const range = object[singleSeries.rangeKey];\n\n if (!range) {\n return null;\n }\n\n const min = range.min;\n const max = range.max;\n const x = object[singleSeries.xKey];\n\n return {\n x,\n range,\n\n pixelX: (x - bounds.minX) / (bounds.maxX - bounds.minX) * this._sizing.renderWidth,\n pixelMinY: typeof min === 'number' ? (1.0 - (min - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null,\n pixelMaxY: typeof max === 'number' ? (1.0 - (max - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight : null\n };\n });\n };\n\n const cpuRendering = singleSeries.rendering === 'bar' || singleSeries.rendering === 'area';\n let commonCPUParams;\n\n if (cpuRendering) {\n // we can currently only render bars with the CPU\n this._context2d = this._context2d || this._canvas.getContext('2d');\n\n if (this._webgl) {\n // make sure we don't have any webgl stuff in the way before we get back to CPU rendering\n this._context.flush();\n }\n\n if (!bounds) {\n bounds = singleSeries.axis.currentBounds;\n }\n\n const zero = singleSeries.zeroLineY === 'bottom' ?\n this._sizing.renderHeight :\n (1.0 - ((singleSeries.zeroLineY || 0) - bounds.minY) / (bounds.maxY - bounds.minY)) * this._sizing.renderHeight;\n\n commonCPUParams = {\n context: this._context2d,\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n sizing: this._sizing,\n zero,\n hasNegatives: !!singleSeries.inDataSpace.find((tuple) => tuple[1] < 0),\n negativeColor: singleSeries.negativeColor,\n zeroWidth: singleSeries.zeroLineWidth,\n zeroColor: singleSeries.zeroLineColor\n };\n\n if (!commonCPUParams.hasNegatives && singleSeries.expandYWith) {\n commonCPUParams.hasNegatives = singleSeries.expandYWith.some((y) => y < 0);\n }\n }\n\n if (singleSeries.rendering === 'bar') {\n drawBars(getIndividualPoints(true), {\n ...commonCPUParams,\n indexInAxis: singleSeries.axis.series.indexOf(singleSeries),\n axisSeriesCount: singleSeries.axis.series.length,\n closestSpacing: globalBounds.closestSpacing,\n bounds\n });\n return;\n }\n\n if (singleSeries.rendering === 'area') {\n drawArea(getIndividualPoints(true), inRenderSpace, {\n ...commonCPUParams,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n gradient: singleSeries.gradient,\n pointRadius: singleSeries.pointRadius,\n highlighted,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n inRenderSpaceAreaBottom\n });\n return;\n }\n\n const drawParams = {\n color: getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex),\n context: this._context,\n width: width || singleSeries.width || defaultLineWidth,\n shadowColor,\n shadowBlur,\n dashed: singleSeries.dashed,\n dashPattern: singleSeries.dashPattern,\n highlighted,\n showIndividualPoints: typeof singleSeries.showIndividualPoints === 'boolean' ? singleSeries.showIndividualPoints : showIndividualPoints,\n getIndividualPoints,\n getRanges: singleSeries.rangeKey ? getRanges : null\n };\n\n if (this._webgl) {\n this._lineProgram.draw(inRenderSpace, drawParams);\n } else {\n drawLine(inRenderSpace, drawParams);\n }\n }\n\n renderBackground(inBackgroundSpace) {\n if (!inBackgroundSpace) {\n return;\n }\n\n if (this._webgl) {\n if (!this._backgroundProgram) {\n this._backgroundProgram = new BackgroundProgram(this._context);\n }\n \n this._backgroundProgram.draw(inBackgroundSpace);\n } else {\n drawBackground(inBackgroundSpace, {\n context: this._context\n });\n }\n }\n\n /**\n * Initializes canvas\n * Currently, just sets sizing\n */\n async _initializeCanvas() {\n this._sizing = await sizeCanvas(this._canvas, this._context);\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged();\n\n if (window.ResizeObserver) {\n let first = true;\n let disabled = false;\n\n this._resizeObserver = new window.ResizeObserver( () => {\n if (first) { // always fires once at the beginning\n first = false;\n return;\n }\n\n if (disabled) {\n return;\n }\n\n disabled = true;\n this.resize().then(() => {\n disabled = false;\n });\n });\n\n this._resizeObserver.observe(this._canvas.parentNode);\n }\n\n if (this._checkIntersection && window.IntersectionObserver) {\n this._intersectionObserver = new window.IntersectionObserver((entries) => {\n clearTimeout(this._intersectionTimeout);\n\n if (!entries[0].isIntersecting) {\n return;\n }\n\n this._intersectionTimeout = setTimeout(() => {\n this.resize();\n }, 50);\n }, {\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(this._canvas.parentNode);\n }\n }\n\n async resize() {\n const sizingPromise = sizeCanvas(this._canvas, this._context, { reset: true });\n this._initialized = sizingPromise;\n\n this._sizing = await this._initialized;\n if (this._initialized !== sizingPromise) {\n return;\n }\n\n this.emit('size_changed', this._sizing);\n this._stateController.markSizeChanged(this);\n }\n\n resizeDebounced() {\n if (this._resizeTimeout) {\n clearTimeout(this._resizeTimeout);\n }\n\n this._resizeTimeout = setTimeout(() => {\n this.resize();\n this._resizeTimeout = null;\n }, 50);\n }\n\n recalculatePosition() {\n if (!this._sizing) {\n return;\n }\n\n this._sizing.boundingRect = this._canvas.getBoundingClientRect();\n }\n\n /**\n * Returns the bounding rect of the element\n *\n * @return {DOMRect}\n */\n get boundingRect() {\n return this._sizing?.boundingRect;\n }\n\n get sizing() {\n return this._sizing;\n }\n\n}\n","import pathsFrom from './paths_from';\nimport {drawZeroLine} from './draw_zero_line';\nimport {DPI_INCREASE} from './size_canvas';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in individual point render space, ie x and y in pixels\n *\n * @param {Array<[number, number]>} individualPoints - data to draw\n * @param {Object} dataInRenderSpace\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the bar to draw\n * @param {{renderWidth: Number, renderHeight: Number}} options.sizing - size of the canvas, in pixels\n * @param {Number} options.zero - y coordinate that represents \"zero\"\n * @param {Boolean} options.hasNegatives - if any values are negative (in which case should render from zero)\n * @param {Array<String>} [options.gradient] - an array of stops, from top to bottom of canvas, to draw with\n * @param {String} [options.zeroColor] - color of the zero line\n * @param {Number} [options.zeroWidth] - width of the zero line\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {String} [options.negativeColor] - color of the area below zero\n * @param {Number} [options.width] - line width\n * @param {Object} [options.inRenderSpaceAreaBottom] - if provided, will use this as the area bottom instead of zero/sizing.renderHeight\n * @private\n */\nexport default function drawArea(individualPoints, dataInRenderSpace, {\n color, context, sizing, zero, hasNegatives, gradient,\n zeroColor, zeroWidth, showIndividualPoints, negativeColor, pointRadius, width, highlighted,\n shadowColor='black', shadowBlur=5, inRenderSpaceAreaBottom\n}) {\n context.fillStyle = color;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (gradient && gradient.length > 2) {\n const globalGradient = context.createLinearGradient(0, 0, 0, sizing.renderHeight);\n\n for (let i = 0; i < gradient.length; i++) {\n const value = gradient[i];\n if (Array.isArray(value)) {\n globalGradient.addColorStop(value[0], value[1]);\n } else {\n globalGradient.addColorStop(i / (gradient.length - 1), value);\n }\n }\n\n context.fillStyle = globalGradient;\n\n if (color === 'gradient') {\n context.strokeStyle = globalGradient;\n }\n } else {\n context.fillStyle = color;\n }\n\n if (!individualPoints.length) {\n return;\n }\n\n // we want to draw a polygon with a flat line at areaBottom, and then follows the shape of the data\n const areaBottom = hasNegatives ? zero : sizing.renderHeight;\n\n const areaPaths = pathsFrom(dataInRenderSpace);\n const areaBottomPaths = inRenderSpaceAreaBottom && pathsFrom(inRenderSpaceAreaBottom);\n\n const linePaths = pathsFrom(dataInRenderSpace, {\n splitAtY: zero\n });\n\n for (let pathI = 0; pathI < areaPaths.length; pathI++) {\n const path = areaPaths[pathI];\n const areaBottomPath = areaBottomPaths && areaBottomPaths[pathI];\n context.beginPath();\n\n const [firstX, _startY] = path[0];\n const [lastX, _lastY] = path[path.length - 1];\n\n if (!areaBottomPaths) {\n context.moveTo(firstX, areaBottom);\n }\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n context.lineTo(x, y);\n }\n\n if (areaBottomPath && areaBottomPath.length) {\n for (let i = areaBottomPath.length - 1; i >= 0; i--) {\n const [x, y] = areaBottomPath[i];\n context.lineTo(x, y);\n }\n\n context.lineTo(...path[0]);\n } else {\n context.lineTo(lastX, areaBottom);\n }\n\n context.fill();\n }\n\n if (highlighted) {\n width += 2;\n }\n\n width *= DPI_INCREASE;\n context.strokeStyle = color;\n context.lineWidth = width;\n // context.shadowBlur = 1;\n\n for (let path of linePaths) {\n if (!path.length) {\n continue;\n }\n\n if (hasNegatives) {\n let positive = true;\n if (path.length >= 2) {\n positive = path[1][1] <= zero;\n } else {\n positive = path[0][1] <= zero;\n }\n\n if (positive) {\n context.strokeStyle = color;\n } else {\n context.strokeStyle = negativeColor;\n }\n }\n\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (zeroWidth) {\n drawZeroLine(areaBottom, {\n context,\n sizing,\n color,\n zero,\n zeroColor,\n zeroWidth\n });\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n\n for (let [x, y] of individualPoints) {\n if (negativeColor && hasNegatives) {\n if (y === zero && zeroColor) {\n context.fillStyle = zeroColor;\n } else if (y < zero) {\n context.fillStyle = color;\n } else {\n context.fillStyle = negativeColor;\n }\n }\n\n context.beginPath();\n context.arc(x, y, pointRadius ||8, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","import {DPI_INCREASE} from './size_canvas';\nimport pathsFrom from './paths_from';\n\n/**\n * Draws the data on the canvas\n * Assumes the data is in render space\n *\n * @param {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array}} dataInRenderSpace - the data to render\n * @param {Object} options - set of options\n * @param {Object} options.context - the context to draw on\n * @param {String} options.color - color of the line to draw\n * @param {Number} [options.width] - line width\n * @param {Number} [options.shadowBlur] - level to blur shadow to\n * @param {String} [options.shadowColor] - color of the shadow\n * @param {String} [options.dashed] - whether or not to make the line dashed\n * @param {Array<Number>} [options.dashPattern] - dash array for the canvas\n * @param {Boolean} [options.highlighted] - whether the line is highlighted or not\n * @param {Boolean} [options.showIndividualPoints] - draw circles at each point\n * @param {Function} [options.getIndividualPoints] - points to draw circles at. Only called when needed.\n * @param {Function} [options.getRanges] - ranges to draw. Only called when needed\n * @private\n */\nexport default function drawLine(dataInRenderSpace, {\n color, width=1, context, shadowColor='black', shadowBlur=5, dashed=false, dashPattern=null, highlighted=false, showIndividualPoints=false, getIndividualPoints, getRanges\n}) {\n if (highlighted) {\n width += 2;\n }\n width *= DPI_INCREASE;\n\n context.strokeStyle = color;\n context.lineWidth = width;\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n if (dashed) {\n context.setLineDash(dashPattern || [5, 5]);\n } else {\n context.setLineDash([]);\n }\n\n const paths = pathsFrom(dataInRenderSpace);\n\n for (let path of paths) {\n context.beginPath();\n\n for (let i = 0; i < path.length; i++) {\n const [x, y] = path[i];\n\n if (i === 0) {\n context.moveTo(x, y);\n } else {\n context.lineTo(x, y);\n }\n }\n\n context.stroke();\n }\n\n if (getRanges) {\n const ranges = getRanges();\n\n context.lineWidth = width; // ensure the same width\n context.strokeStyle = color;\n context.setLineDash([]);\n const horizontalBarWidth = 8 * DPI_INCREASE;\n\n for (let range of ranges) {\n if (!range) {\n continue;\n }\n\n const { pixelX, pixelMinY, pixelMaxY } = range;\n\n // bar on bottom\n if (pixelMinY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMinY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMinY);\n context.stroke();\n }\n\n // bar on top\n if (pixelMaxY !== null) {\n context.beginPath();\n context.moveTo(pixelX - (horizontalBarWidth / 2), pixelMaxY);\n context.lineTo(pixelX + (horizontalBarWidth / 2), pixelMaxY);\n context.stroke();\n }\n\n if (pixelMinY === null || pixelMaxY === null) {\n continue;\n }\n\n // draw a vertical line for the range\n context.beginPath();\n context.moveTo(pixelX, pixelMinY);\n context.lineTo(pixelX, pixelMaxY);\n context.stroke();\n }\n }\n\n if (showIndividualPoints) {\n context.fillStyle = color;\n const individualPoints = getIndividualPoints();\n\n for (let [x, y] of individualPoints) {\n context.beginPath();\n context.arc(x, y, width + 4, 0, 2 * Math.PI, false);\n context.fill();\n }\n }\n}\n","/**\n * Draws the background on a 2d canvas\n *\n * @param {Array<{ minXt: number, maxXt: number, color: string }>} data\n * @param {CanvasRenderingContext2D} context\n */\nexport default function drawBackground({ data }, { context }) {\n const width = context.canvas.width;\n const height = context.canvas.height;\n\n for (let { minXt, maxXt, color } of data) {\n context.fillStyle = color;\n context.fillRect(minXt*width, 0, (maxXt - minXt)*width, height);\n }\n}\n","export function calculatePrecision(value) {\n return Math.max(-Math.log10(Math.abs(value)) + 2, 0);\n}\n\nexport function calculateTimePrecision(minDate, maxDate) {\n minDate = new Date(minDate);\n maxDate = new Date(maxDate);\n\n const range = maxDate.valueOf() - minDate.valueOf();\n if (range < 3*1000) {\n return 'ms';\n } else if (range < 10*60*1000) {\n return 's';\n } else {\n return 'm';\n }\n}\n\nexport function roundToPrecision(value, precision=null) {\n if (precision === null) {\n precision = calculatePrecision(value);\n }\n\n if (isNaN(precision) || precision > 100) {\n return value.toString();\n }\n\n const rounded = value.toFixed(Math.ceil(precision));\n let stripped = rounded;\n if (rounded.includes('.')) {\n stripped = stripped.replace(/\\.?0+$/g, '');\n }\n\n if (stripped === '') {\n return '0';\n }\n\n return stripped;\n}\n\nconst DATE_TIME_FORMATTERS = {};\n\n/**\n * Given a timezone string, gets the offset relative to utc in milliseconds\n * For example, America/New_York in winter is GMT-05:00, so it evaluates to -5*60*60*1000\n *\n * @param {String} timeZone - the time zone string\n * @param {Date} sampleDate - a date to use in the conversions, since it can be time-of-year dependent with Daylight Savings Time\n * @return {number|null}\n */\nfunction timezoneToOffsetMS(timeZone, sampleDate) {\n try { // formats are finicky, so give up rather than abort rendering\n let datetimeFormatter = DATE_TIME_FORMATTERS[timeZone];\n if (!datetimeFormatter) {\n let properTimeZone = timeZone;\n if (!timeZone || timeZone === 'local') {\n properTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n datetimeFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: properTimeZone,\n timeZoneName: 'longOffset'\n });\n DATE_TIME_FORMATTERS[timeZone] = datetimeFormatter;\n }\n\n const parts = datetimeFormatter.formatToParts(sampleDate);\n const offsetPart = parts.find(part => part.type === 'timeZoneName');\n\n if (!offsetPart) {\n return null;\n }\n\n if (offsetPart.value === 'GMT') {\n return 0;\n }\n\n if (!/^GMT[+-]\\d{2}:\\d{2}$/.test(offsetPart.value)) {\n return null;\n }\n\n const [hours, minutes] = offsetPart.value.slice(3).split(':');\n\n return parseInt(hours)*60*60*1000 + parseInt(minutes)*60*1000;\n } catch (e) {\n console.error(new Error(`Could not parse timezone offset for ${sampleDate} in ${timeZone}`)); // eslint-disable-line no-console\n console.error(e); // eslint-disable-line no-console\n return null;\n }\n}\n\n/**\n * Gets the Date object that represents the start of day in a given timezone\n * Note that this is still a native date object, so it will be in the local timezone\n * Its timestamp, however, will correspond to the start of the day in the given timezone\n *\n * @param date\n * @param timezone\n * @return {Date}\n */\nexport function startOfDayInTimezone(date, timezone) {\n if (!timezone) {\n const startOfDay = new Date(date);\n startOfDay.setHours(0, 0, 0, 0);\n return startOfDay;\n }\n\n const offset = timezoneToOffsetMS(timezone, date); // ms between timezone and utc\n let startOfDay = new Date(date);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const difference = startOfDay.valueOf() - date.valueOf();\n\n // if we would have gone forward a day when offset is taken into account, we need to go back a day again\n if (difference > offset) {\n startOfDay = new Date(startOfDay.valueOf() - 24*60*60*1000);\n }\n\n return new Date(startOfDay.valueOf() - offset);\n}\n\nfunction formatTime(time, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle='24h', timeZone}) {\n const utc = timeZone && timeZone.toLowerCase() === 'utc';\n if (timeZone && !utc && timeZone !== 'local' && window.Intl && window.Intl.DateTimeFormat) {\n const offset = timezoneToOffsetMS(timeZone, time);\n const localOffset = timezoneToOffsetMS('local', time);\n\n if (typeof offset === 'number' && typeof localOffset === 'number') {\n time = new Date(time.valueOf() + offset - localOffset);\n }\n }\n\n const year = utc ? time.getUTCFullYear() : time.getFullYear();\n const month = (utc ? time.getUTCMonth() : time.getMonth()) + 1;\n const day = utc ? time.getUTCDate() : time.getDate();\n\n if (unitOverride === 'year') {\n return year.toString();\n }\n\n if (justDate) {\n return utc ? `${month}/${day}/${year}` : time.toLocaleDateString();\n }\n\n if (justMonthAndDay) {\n // eg Jan 19\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return `${monthNames[month - 1]} ${day}`;\n }\n\n const hours = utc ? time.getUTCHours() : time.getHours();\n const minutes = utc ? time.getUTCMinutes() : time.getMinutes();\n const seconds = utc ? time.getUTCSeconds() : time.getSeconds();\n const milliseconds = utc ? time.getUTCMilliseconds() : time.getMilliseconds();\n\n let timeString;\n\n if (clockStyle === '12h') {\n timeString = `${((hours + 11) % 12 + 1).toString()}:${minutes.toString().padStart(2, '0')}`;\n } else {\n timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n }\n\n if (precision === 's' || precision === 'ms') {\n timeString += `:${seconds.toString().padStart(2, '0')}`;\n }\n\n if (precision === 'ms') {\n timeString += `.${milliseconds.toString().padStart(3, '0')}`;\n }\n\n if (clockStyle === '12h') {\n timeString += hours >= 12 ? 'pm' : 'am';\n }\n\n if (justTime) {\n return timeString;\n }\n\n if (utc) {\n timeString += ' UTC';\n }\n\n return (utc ? `${month}/${day}/${year}` : time.toLocaleDateString()) + ' ' + timeString;\n}\n\nexport function formatX(x, {dates=false, precision=null, justTime=false, justDate=false, justMonthAndDay=false, clockStyle='24h', unitOverride, timeZone, integersOnly=false, inverseEnumMap}={}) {\n if (dates && !(x instanceof Date)) {\n x = new Date(x);\n\n if (isNaN(x)) {\n return 'Invalid Date';\n }\n }\n\n if (x instanceof Date) {\n return formatTime(x, {precision, justTime, justDate, justMonthAndDay, unitOverride, clockStyle, timeZone});\n }\n\n if (isNaN(x)) {\n return 'NaN';\n }\n\n if (inverseEnumMap) {\n if (Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return inverseEnumMap[Math.round(x)];\n }\n\n if (integersOnly && Math.abs(x - Math.round(x)) > 1e-10) {\n return '';\n }\n\n return roundToPrecision(x, precision);\n}\n\nexport function formatY(y, {precision=null, log=false}={}) {\n if (y === null) {\n return 'null';\n }\n\n if (isNaN(y)) {\n return 'NaN';\n }\n\n if (log) {\n return `10^${roundToPrecision(Math.log10(y), precision)}`;\n }\n\n return roundToPrecision(y, precision);\n}\n","export const Y_AXIS_WIDTH = 32;\nexport const BIG_Y_AXIS_LABEL_OFFSET = 20;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {formatX, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nfunction getYLabelContent({ yLabel, y, fullYPrecision}) {\n if (fullYPrecision && !yLabel) {\n if (y === undefined) {\n return 'undefined';\n }\n\n if (y === null) {\n return 'null';\n }\n\n return y.toString();\n }\n\n if (typeof yLabel === 'number') {\n if (fullYPrecision) {\n return yLabel.toString();\n } else {\n return formatY(yLabel);\n }\n }\n\n if (typeof yLabel === 'object') {\n return formatY(y);\n }\n\n return yLabel || formatY(y);\n}\n\nfunction TooltipLabel({ axisLabel, x, y, xLabel, yLabel, textLeft, textTop, includeSeriesLabel, includeXValue, includeYValue, includeXLabel, includeYLabel, fullYPrecision, formatXOptions }) {\n let i = 0;\n\n return (\n <g>\n {\n includeSeriesLabel &&\n <text x={textLeft} y={textTop + (i++)*12}>\n {axisLabel}\n </text>\n }\n\n {\n includeXValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeXLabel && 'x: '}{xLabel || formatX(x, formatXOptions)}\n </text>\n }\n\n {\n includeYValue &&\n <text x={textLeft} y={textTop + (i++) * 12}>\n {includeYLabel && 'y: '}{getYLabelContent({ yLabel, y, fullYPrecision})}\n </text>\n }\n </g>\n );\n}\n\nTooltipLabel.propTypes = {\n axisLabel: PropTypes.string,\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n xLabel: PropTypes.string,\n yLabel: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n textLeft: PropTypes.number.isRequired,\n textTop: PropTypes.number.isRequired,\n fullYPrecision: PropTypes.bool,\n formatXOptions: PropTypes.object,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n\nexport default class Tooltip extends React.PureComponent {\n\n render() {\n const textPadding = 3;\n let height = 12*3 + 2*textPadding;\n\n if (!this.props.includeSeriesLabel) {\n height -= 12;\n }\n\n if (!this.props.includeXValue) {\n height -= 12;\n }\n\n if (!this.props.includeYValue) {\n height -= 12;\n }\n\n const caretSize = 7;\n const halfHeight = height/2;\n const caretPadding = 4;\n\n const textTop = -halfHeight + textPadding;\n\n const formatXOptions = {\n clockStyle: this.props.clockStyle,\n timeZone: this.props.timeZone\n };\n\n const passThroughProps = {\n includeSeriesLabel: this.props.includeSeriesLabel,\n includeXLabel: this.props.includeXLabel,\n includeYLabel: this.props.includeYLabel,\n includeXValue: this.props.includeXValue,\n includeYValue: this.props.includeYValue,\n formatXOptions\n };\n\n const preparedTooltips = this.props.tooltips.map((tooltip) => {\n const { x, y, pixelY, pixelX, series, index, xLabel, yLabel, fullYPrecision } = tooltip;\n\n if (typeof pixelX !== 'number') {\n return null;\n }\n\n const axisLabel = (series.name || series.yKey || index).toString();\n let width = Math.max(axisLabel.length, (xLabel || formatX(x, formatXOptions)).length + 4, getYLabelContent({ yLabel, y, fullYPrecision}).length + 4) * 7.5;\n if (series.tooltipWidth) {\n width = series.tooltipWidth;\n }\n\n let fixedPosition = this.props.elementWidth < (width + 2*caretSize + 2*caretPadding);\n\n let multiplier = 1;\n if (pixelX >= this.props.elementWidth - (width + 2*caretSize + caretPadding)) {\n multiplier = -1;\n }\n\n if (pixelX < width + 2*caretSize + caretPadding && multiplier === -1) {\n fixedPosition = true;\n }\n\n if (y === null) {\n fixedPosition = true;\n }\n\n if (this.props.alwaysFixedPosition) {\n fixedPosition = true;\n }\n\n let textLeft = caretSize + caretPadding;\n if (multiplier < 0) {\n textLeft = -width - textLeft;\n } else {\n textLeft += 6;\n }\n\n if (!isFinite(pixelX)) {\n return null;\n }\n\n const transform = `translate(${pixelX},${pixelY})`;\n\n const commonLabelProps = {\n fullYPrecision: fullYPrecision || this.props.maxPrecision,\n x,\n y,\n axisLabel,\n xLabel,\n yLabel,\n ...passThroughProps\n };\n\n let yTranslation = 0;\n let baseLeft;\n\n if (fixedPosition) {\n textLeft = 6;\n\n baseLeft = this.props.elementWidth / 2 - width / 2;\n\n if (width > this.props.elementWidth && !this.props.floating) {\n baseLeft -= Y_AXIS_WIDTH * this.props.axisCount / 2;\n }\n\n yTranslation = 18;\n\n if (this.props.floating) {\n if (this.props.floatPosition === 'bottom') {\n yTranslation = this.props.elementHeight + halfHeight + 4;\n } else {\n yTranslation = -height;\n }\n\n if (this.props.floatDelta) {\n yTranslation += this.props.floatDelta;\n }\n }\n }\n\n return {\n ...tooltip,\n label: axisLabel,\n indexInAxis: series?.axis?.series?.indexOf(series),\n axisLabel,\n width,\n fixedPosition,\n multiplier,\n textLeft,\n transform,\n commonLabelProps,\n textTop,\n height,\n caretSize,\n halfHeight,\n caretPadding,\n yTranslation,\n baseLeft\n };\n }).filter(Boolean);\n\n const CustomTooltipComponent = this.props.customTooltip;\n\n let groupedTooltips;\n if (this.props.combineTooltips) {\n let combinationThreshold = 50; // in px how close tooltips should be to combine\n if (typeof this.props.combineTooltips === 'number') {\n combinationThreshold = this.props.combineTooltips;\n }\n\n groupedTooltips = [];\n\n for (let tooltip of preparedTooltips) {\n let added = false;\n for (let group of groupedTooltips) {\n if (Math.abs(group.pixelX - tooltip.pixelX) <= combinationThreshold) {\n group.tooltips.push(tooltip);\n if (tooltip.pixelX > group.pixelX) {\n group.pixelX = tooltip.pixelX;\n group.multiplier = tooltip.multiplier;\n }\n\n if (tooltip.pixelY < group.pixelY) {\n group.pixelY = tooltip.pixelY;\n }\n\n added = true;\n break;\n }\n }\n\n if (!added) {\n groupedTooltips.push({\n pixelX: tooltip.pixelX,\n pixelY: tooltip.pixelY,\n multiplier: tooltip.multiplier,\n tooltips: [tooltip]\n });\n }\n }\n\n for (let group of groupedTooltips) {\n let totalHeight = 0;\n let maxWidth = 0;\n\n // sort by indexInAxis\n group.tooltips.sort((a, b) => a.indexInAxis - b.indexInAxis);\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop = totalHeight;\n totalHeight += group.tooltips[i].height;\n maxWidth = Math.max(maxWidth, group.tooltips[i].width);\n }\n\n for (let i = 0; i < group.tooltips.length; i++) {\n group.tooltips[i].textTop -= totalHeight/2;\n group.tooltips[i].textTop += textPadding;\n }\n\n group.height = totalHeight;\n group.halfHeight = totalHeight / 2;\n group.caretSize = caretSize;\n group.width = maxWidth;\n }\n }\n\n return (\n <div className=\"grapher-tooltip\">\n <svg>\n {\n preparedTooltips.map((tooltip, i) => {\n const { color, fixedPosition, width, transform, baseLeft, commonLabelProps, yTranslation, multiplier, textLeft, textTop } = tooltip;\n\n if (this.props.customTooltip || groupedTooltips) {\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color}/>\n </g>\n );\n }\n\n // display in a fixed position if not wide enough\n if (fixedPosition) {\n return (\n <g key={i} className=\"tooltip-item tooltip-item-fixed\">\n <circle r={4} fill={color} transform={transform} />\n\n <g transform={`translate(${baseLeft}, ${yTranslation})`}>\n <path stroke={color} d={`M0,0 V-${halfHeight} h${width} V${halfHeight} h${-width} V0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n </g>\n );\n }\n\n return (\n <g key={i} transform={transform} className=\"tooltip-item\">\n <circle r={4} fill={color} />\n\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n <TooltipLabel\n textLeft={textLeft} textTop={textTop}\n {...commonLabelProps}\n />\n </g>\n );\n })\n }\n\n {\n !this.props.customTooltip && groupedTooltips &&\n groupedTooltips.map(({ tooltips, pixelX, pixelY, halfHeight, multiplier, color, width }, i) =>\n <g key={i} transform={`translate(${pixelX},${pixelY})`} className=\"tooltip-item\">\n <path stroke={color} d={`M${multiplier*caretPadding},0 L${multiplier*caretSize*2},-${caretSize} V-${halfHeight} h${multiplier*width} V${halfHeight} h${multiplier*-width} V${caretSize} L${multiplier*caretPadding},0`} />\n\n {\n tooltips.map((tooltip, j) =>\n <TooltipLabel\n key={j}\n textTop={tooltip.textTop}\n textLeft={tooltip.textLeft}\n {...tooltip.commonLabelProps}\n />\n )\n }\n </g>\n )\n }\n </svg>\n\n {\n this.props.customTooltip &&\n (groupedTooltips || preparedTooltips).map((tooltip, i) =>\n <div\n key={i}\n className=\"custom-tooltip-container\"\n style={{top: tooltip.pixelY, left: tooltip.pixelX}}\n >\n <CustomTooltipComponent {...tooltip} />\n </div>\n )\n }\n </div>\n );\n }\n\n}\n\nTooltip.defaultProps = {\n includeSeriesLabel: true,\n includeXLabel: true,\n includeYLabel: true,\n includeXValue: true,\n includeYValue: true\n};\n\nTooltip.propTypes = {\n mouseX: PropTypes.number.isRequired,\n mouseY: PropTypes.number.isRequired,\n elementHeight: PropTypes.number.isRequired,\n elementWidth: PropTypes.number.isRequired,\n tooltips: PropTypes.arrayOf(PropTypes.shape({\n x: PropTypes.oneOfType([PropTypes.number, PropTypes.instanceOf(Date)]),\n y: PropTypes.number,\n pixelY: PropTypes.number,\n color: PropTypes.string,\n xLabel: PropTypes.string,\n yLabel: PropTypes.any,\n fullYPrecision: PropTypes.bool\n })),\n axisCount: PropTypes.number.isRequired,\n maxPrecision: PropTypes.bool.isRequired,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n ...CustomPropTypes.TooltipOptionsRaw\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ContextMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.setTextRef = this.setTextRef.bind(this);\n }\n \n setTextRef(ref) {\n this.textRef = ref;\n\n if (this.props.contextMenu.showing && this.textRef) {\n const range = document.createRange();\n const selection = window.getSelection();\n\n selection.removeAllRanges();\n\n range.selectNodeContents(this.textRef);\n selection.addRange(range);\n this.textRef.focus();\n }\n }\n \n formatDateTime(dateTimeStr) {\n const [datePart, timePart] = dateTimeStr.split(', ');\n\n const [month, day, year] = datePart.split('/');\n const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}/${year}`;\n\n const [time, period] = timePart.split(' ');\n const [hours, minutes] = time.split(':');\n const formattedHours = hours.padStart(2, '0');\n const formattedTime = `${formattedHours}:${minutes} ${period}`;\n\n return `${formattedDate} ${formattedTime}`;\n }\n \n render() {\n const { x, y, showing, value } = this.props.contextMenu;\n\n const style = { left: x, top: y, width: '150px'};\n \n if (!showing || !value || value.toLocaleString() === 'Invalid Date' || isNaN(x) || isNaN(y)) {\n return null;\n }\n\n const displayValue = value instanceof Date ? this.formatDateTime(value.toLocaleString()) : value;\n return (\n <div className=\"grapher-context-menu\" style={style}>\n <div className=\"menu-item\">\n <div className=\"menu-text\" autoFocus={true} ref={this.setTextRef}>\n {displayValue}\n </div>\n </div>\n </div>\n );\n }\n\n}\n\nContextMenu.propTypes = {\n contextMenu: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n showing: PropTypes.bool,\n value: PropTypes.oneOfType([\n PropTypes.instanceOf(Date),\n PropTypes.number,\n PropTypes.object\n ])\n }).isRequired\n};\n","import inferType from '../infer_type';\nimport { SIMPLE_DATA_TYPES } from '../data_types';\n\n/**\n * Given a series of a simple type (ie, not a function or an observable), converts it into data space\n *\n * @param {*} singleSeries\n * @param {Object} options\n * @return {*}\n */\nexport default function simpleSeriesToDataSpace(singleSeries, options={}) {\n const type = inferType(singleSeries, { useSimpleData: true, data: options.data });\n if (!SIMPLE_DATA_TYPES.includes(type)) {\n throw new Error(`Cannot normalize ${type} (expected a simple type)`);\n }\n\n const inDataSpace = {\n tuples: tuplesToDataSpace,\n values: valuesToDataSpace,\n objects: objectsToDataSpace\n }[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);\n\n if (singleSeries.square) {\n const square = [];\n let prevY = options.prevY;\n for (let tuple of inDataSpace) {\n if (prevY !== undefined) {\n square.push([tuple[0], prevY]);\n }\n square.push(tuple);\n prevY = tuple[1];\n }\n\n return square;\n }\n\n if (singleSeries.shiftXBy) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'string') {\n const originalXValue = tuple[0];\n tuple[0] = new Date(new Date(tuple[0]).valueOf() + singleSeries.shiftXBy);\n if (isNaN(tuple[0])) {\n tuple[0] = options.stateController.enumToNumber(originalXValue, singleSeries);\n }\n } else if (tuple[0] instanceof Date) {\n tuple[0] = new Date(tuple[0].valueOf() + singleSeries.shiftXBy);\n } else if (typeof tuple[0] === 'number') {\n tuple[0] += singleSeries.shiftXBy;\n }\n }\n }\n\n if (singleSeries.xUnixDates) {\n for (let tuple of inDataSpace) {\n if (typeof tuple[0] === 'number') {\n tuple[0] = new Date(tuple[0]*1000);\n }\n }\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a values array to data space\n *\n * @param {Array<Number|String>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {Number} [options.valueXStart]\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction valuesToDataSpace(data, singleSeries, options) {\n const inDataSpace = [];\n\n for (let i = 0; i < data.length; i++) {\n let yValue = data[i];\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([i + (options.valueXStart || 0), yValue]);\n }\n\n return inDataSpace;\n}\n\n/**\n * Converts a tuples array to data space\n *\n * @param {Array<Array<Number|Date|null>>} data\n * @param {Object} singleSeries\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction tuplesToDataSpace(data, singleSeries, options) {\n return [...data.map(([ xValue, yValue]) => {\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof xValue === 'string') {\n const originalXValue = xValue;\n xValue = new Date(xValue);\n\n if (isNaN(xValue)) {\n xValue = options.stateController.enumToNumber(originalXValue, singleSeries, true);\n }\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, singleSeries);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n return [xValue, yValue];\n })];\n}\n\nfunction readBinaryFormatValue(view, offset, index) {\n const localOffset = view.getUint32(offset + 2 + Uint32Array.BYTES_PER_ELEMENT*index, true);\n\n if (localOffset === 0) {\n return null;\n }\n\n const type = view.getUint8(localOffset);\n\n if (type === 0) {\n return view.getFloat64(offset + localOffset + 1, true);\n } else if (type === 1 || type === 6) {\n return null;\n } else if (type === 3) {\n return new Date(view.getFloat64(offset + localOffset + 1, true));\n } else {\n throw new Error(`Binary format type ${type} not supported`);\n }\n}\n\n/**\n * Converts an objects array to data space\n *\n * @param {Array<Object>} data\n * @param {Object} series\n * @param {Object} options\n * @param {StateController} options.stateController\n * @return {Array<Array<Number|Date|null>>}\n */\nfunction objectsToDataSpace(data, series, options) {\n if (!series.xKey || typeof series.xKey !== 'string') {\n throw new Error('xKey must be provided in the series');\n }\n\n if (!series.yKey || typeof series.yKey !== 'string') {\n throw new Error('yKey must be provided in the series');\n }\n\n const inDataSpace = [];\n\n for (let point of data) {\n if (point.buffer instanceof ArrayBuffer) {\n const view = new DataView(point.buffer);\n const xIndex = point.channels[series.xKey];\n const yIndex = point.channels[series.yKey];\n\n for (let offset of point.offsets) {\n inDataSpace.push([readBinaryFormatValue(view, offset, xIndex), readBinaryFormatValue(view, offset, yIndex)]);\n }\n } else if (Array.isArray(point[series.yKey])) {\n if (point[series.yKey].length && !Array.isArray(point[series.yKey][0]) && typeof point[series.yKey][0] === 'object') {\n for (let subpoint of point[series.yKey]) {\n let yValue = subpoint[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n let xValue = subpoint[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n } else {\n inDataSpace.push(...point[series.yKey]);\n }\n } else {\n let yValue = point[series.yKey];\n if (yValue === undefined) {\n yValue = null;\n }\n\n let xValue = point[series.xKey];\n if (typeof xValue === 'string') {\n xValue = new Date(xValue);\n }\n\n if (typeof yValue === 'string') {\n yValue = options.stateController.enumToNumber(yValue, series);\n }\n\n if (typeof yValue === 'boolean') {\n yValue = +yValue;\n }\n\n inDataSpace.push([xValue, yValue]);\n }\n }\n\n return inDataSpace;\n}\n","function finalizeBounds(bounds, { dates }) {\n const initial = (bounds.minX === null && bounds.maxX === null) || bounds.minY === null || bounds.maxY === null;\n\n for (let key of Object.keys(bounds)) {\n if (typeof bounds[key] !== 'number') {\n bounds[key] = 0;\n }\n }\n\n bounds.initial = initial;\n bounds.dates = dates;\n\n return bounds;\n}\n\nfunction percentileBounds(inDataSpace, bounds, {percentile=100, percentileAsymmetry=0}={}) {\n let dates = false;\n\n bounds.minX = inDataSpace[0][0];\n if (bounds.minX instanceof Date) {\n bounds.minX = bounds.minX.valueOf();\n dates = true;\n }\n\n bounds.maxX = inDataSpace[inDataSpace.length - 1][0];\n if (bounds.maxX instanceof Date) {\n bounds.maxX = bounds.maxX.valueOf();\n dates = true;\n }\n\n const sortedByY = inDataSpace\n .filter(([_x, y]) => typeof y === 'number')\n .sort(([_x1, y1], [_x2, y2]) => y1 - y2);\n\n if (!sortedByY.length) {\n return finalizeBounds(bounds, {dates});\n }\n\n const asymmetry = Math.min(Math.abs(percentileAsymmetry), (100-percentile)/2) * (percentileAsymmetry < 0 ? -1 : 1);\n const inBottomPercentile = (100-percentile)/2 + asymmetry;\n const inTopPercentile = (100-percentile)/2 - asymmetry;\n\n const startIndex = Math.floor((sortedByY.length-1)*inBottomPercentile/100);\n const endIndex = Math.floor((sortedByY.length-1)*(100-inTopPercentile)/100);\n\n bounds.minY = sortedByY[startIndex][1];\n bounds.maxY = sortedByY[endIndex][1];\n\n return finalizeBounds(bounds, {dates});\n}\n\nexport default function calculateDataBounds(inDataSpace, {percentile=100, percentileAsymmetry=0}={}) {\n let bounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null\n };\n\n if (percentile !== 100 && inDataSpace.length) {\n return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});\n }\n\n let dates = false;\n let prevX = null;\n\n for (let [x, y] of inDataSpace) {\n if (x instanceof Date) {\n x = x.valueOf();\n dates = true;\n }\n\n if (typeof bounds.minX !== 'number' || x < bounds.minX) {\n bounds.minX = x;\n }\n\n if (typeof bounds.maxX !== 'number' || x > bounds.maxX) {\n bounds.maxX = x;\n }\n\n if (typeof prevX === 'number' && typeof x === 'number') {\n const spacing = x - prevX;\n if (typeof bounds.closestSpacing !== 'number' || spacing < bounds.closestSpacing) {\n bounds.closestSpacing = spacing;\n }\n }\n prevX = x;\n\n if (typeof y !== 'number') {\n continue;\n }\n\n if (typeof bounds.minY !== 'number' || y < bounds.minY) {\n bounds.minY = y;\n }\n\n if (typeof bounds.maxY !== 'number' || y > bounds.maxY) {\n bounds.maxY = y;\n }\n }\n\n return finalizeBounds(bounds, {dates});\n}\n","export default function mergeBounds(boundsList) {\n const mergedBounds = {\n minX: null,\n maxX: null,\n minY: null,\n maxY: null,\n closestSpacing: null,\n dates: false,\n initial: true\n };\n\n for (let { minX, maxX, minY, maxY, dates, initial, closestSpacing } of boundsList) {\n if (dates) {\n mergedBounds.dates = true;\n }\n\n if (initial) {\n continue;\n }\n mergedBounds.initial = false;\n\n if (mergedBounds.minX === null || minX < mergedBounds.minX) {\n mergedBounds.minX = minX;\n }\n\n if (mergedBounds.maxX === null || maxX > mergedBounds.maxX) {\n mergedBounds.maxX = maxX;\n }\n\n if (mergedBounds.closestSpacing === null || closestSpacing < mergedBounds.closestSpacing) {\n mergedBounds.closestSpacing = closestSpacing;\n }\n\n if (mergedBounds.minY === null || minY < mergedBounds.minY) {\n mergedBounds.minY = minY;\n }\n\n if (mergedBounds.maxY === null || maxY > mergedBounds.maxY) {\n mergedBounds.maxY = maxY;\n }\n }\n\n if (mergedBounds.minX === null) {\n mergedBounds.minX = 0;\n }\n\n if (mergedBounds.maxX === null) {\n mergedBounds.maxX = 0;\n }\n\n if (mergedBounds.closestSpacing === null) {\n mergedBounds.closestSpacing = 1;\n }\n\n if (mergedBounds.minY === null) {\n mergedBounds.minY = 0;\n }\n\n if (mergedBounds.maxY === null) {\n mergedBounds.maxY = 0;\n }\n\n return mergedBounds;\n}\n","/**\n * Expands bounds to give a little y padding\n *\n * @param {Object} bounds\n * @param {?Number} bounds.minY\n * @param {?Number} bounds.maxY\n * @param {?Number} bounds.minX\n * @param {?Number} bounds.maxX\n * @param {Array<Number>} [expandYWith]\n * @param {Number} [extendXForNBars=0]\n * @return {Object}\n */\nexport default function expandBounds(bounds, {expandYWith = [], extendXForNBars=0}) {\n const expandedBounds = Object.assign({}, bounds);\n for (let y of expandYWith) {\n if (y === null || y === undefined) {\n continue;\n }\n\n if (typeof expandedBounds.minY !== 'number' || y < expandedBounds.minY) {\n expandedBounds.minY = y;\n }\n\n if (typeof expandedBounds.maxY !== 'number' || y > expandedBounds.maxY) {\n expandedBounds.maxY = y;\n }\n }\n\n expandedBounds.unscaledMinY = expandedBounds.minY;\n expandedBounds.unscaledMaxY = expandedBounds.maxY;\n\n const range = expandedBounds.maxY - expandedBounds.minY;\n const midpoint = expandedBounds.minY + range/2;\n expandedBounds.minY = midpoint - 1.05*range/2;\n expandedBounds.maxY = midpoint + 1.05*range/2;\n\n if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {\n if (expandedBounds.minY > 0) {\n expandedBounds.minY *= 0.95;\n expandedBounds.maxY *= 1.05;\n } else if (expandedBounds.minY < 0) {\n expandedBounds.minY *= 1.05;\n expandedBounds.maxY *= 0.95;\n } else {\n expandedBounds.minY -= 1;\n expandedBounds.maxY += 1;\n }\n }\n\n if (extendXForNBars && expandedBounds.minX !== expandedBounds.maxX && expandedBounds.minX !== null && expandedBounds.maxX !== null) {\n // Base expansion factor on expected bar count\n const barWidth = (expandedBounds.maxX - expandedBounds.minX) / extendXForNBars;\n expandedBounds.minX -= barWidth/2;\n expandedBounds.maxX += barWidth/2;\n }\n\n return expandedBounds;\n}\n","/**\n * Finds the closest point to the target\n *\n * @param {Array} data - the data, in data space\n * @param {Number} targetX - the x coordinate to get closest to\n * @param {Object} [searchParams]\n * @param {String} [searchParams.searchType] - whether to search for the closest, one before, or one after\n * @param {Boolean} [searchParams.returnIndex] - whether to return the index or the object itself\n * @param {Number} [startIndex] - where to start the search from\n * @param {Number} [endIndex] - where to end the search\n * @return {Array|Number}\n */\nexport default function binarySearch(data, targetX, searchParams={}, startIndex=0, endIndex=undefined) {\n if (endIndex === undefined) {\n endIndex = data.length - 1;\n }\n\n if (data.length === 0) {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n\n const middleIndex = Math.floor((startIndex + endIndex)/2);\n\n if (targetX === data[middleIndex][0] || (data[middleIndex][0] instanceof Date && data[middleIndex][0].valueOf() === targetX)) {\n if (searchParams.returnIndex) {\n return middleIndex;\n } else {\n return data[middleIndex];\n }\n }\n\n if (startIndex === endIndex) {\n if (data[startIndex][0] < targetX && searchParams.searchType === 'before') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else if (data[startIndex][0] > targetX && searchParams.searchType === 'after') {\n return searchParams.returnIndex ? startIndex : data[startIndex];\n } else {\n return searchParams.returnIndex ? -1 : [null, null];\n }\n }\n\n if (endIndex - 1 === startIndex) {\n let index;\n\n if (searchParams.searchType === 'before') {\n index = startIndex;\n // index = (targetX <= data[startIndex][0]) ? startIndex : endIndex;\n } else if (searchParams.searchType === 'after') {\n index = endIndex;\n // index = (targetX >= data[endIndex][0]) ? endIndex : startIndex;\n } else {\n index = Math.abs(data[startIndex][0] - targetX) > Math.abs(data[endIndex][0] - targetX) ?\n endIndex :\n startIndex;\n }\n\n return searchParams.returnIndex ? index : data[index];\n }\n\n if (targetX > data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, middleIndex, endIndex);\n }\n\n if (targetX < data[middleIndex][0]) {\n return binarySearch(data, targetX, searchParams, startIndex, middleIndex);\n }\n}\n","import binarySearch from '../../helpers/binary_search';\n\nfunction validateSelectedSpaceConversion({ data, inSelectedSpace, firstIndex, lastIndex, ignoreDiscontinuities }) { // eslint-disable-line no-unused-vars\n let correct = data.slice(firstIndex + 1, lastIndex);\n if (ignoreDiscontinuities) {\n correct = correct.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (correct.length !== inSelectedSpace.length) {\n console.log({ // eslint-disable-line no-console\n data,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n sdl: window.sdl\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n\n for (let i = 0; i < correct.length; i++) {\n if (undateify(correct[i][0]) !== undateify(inSelectedSpace[i][0]) || correct[i][1] !== inSelectedSpace[i][1]) {\n console.log({ // eslint-disable-line no-console\n i,\n attempt: inSelectedSpace.map(([x, y]) => [undateify(x), y]),\n correct: correct.map(([x, y]) => [undateify(x), y]),\n correctX: undateify(correct[i][0]),\n correctY: correct[i][1],\n attemptX: undateify(inSelectedSpace[i][0]),\n attemptY: inSelectedSpace[i][1]\n });\n window.tacomaDataPaused = true;\n throw new Error('Failed to select via swap');\n }\n }\n}\n\n/**\n * Converts from data space to selected space\n *\n * @param {Array<Array<Number>>} data\n * @param {{data: Array<Array<Number>>}|*} [swap]\n * @param {Number} minX\n * @param {Number} maxX\n * @param {Boolean} ignoreDiscontinuities\n * @param {Boolean} square\n * @return {{data: Array<Array<Number>>, lastAdded: boolean, firstAdded: boolean, afterIndex: Number, ignoreDiscontinuities: boolean, minX: Number, maxX: Number, beforeIndex: Number}}\n */\nexport default function dataSpaceToSelectedSpace({ data, swap, minX, maxX, ignoreDiscontinuities, square }) {\n if (!data.length || data.length && minX > data[data.length - 1][0] || data.length && maxX < data[0][0]) {\n //let previouslyEmpty = !data.length;\n return {\n data: [\n [minX, null],\n [maxX, null]\n ],\n firstAdded: true,\n lastAdded: true\n //previouslyEmpty\n };\n }\n\n let beforeIndex = binarySearch(data, minX, { searchType: 'before', returnIndex: true }) || 0;\n let afterIndex = binarySearch(data, maxX, { searchType: 'after', returnIndex: true }) || 0;\n if (afterIndex === -1) {\n afterIndex = 0;\n }\n\n while (beforeIndex >= 0 && data[beforeIndex][0] >= minX) {\n beforeIndex --;\n }\n\n while (afterIndex < data.length && data[afterIndex][0] <= maxX) {\n afterIndex ++;\n }\n\n let inSelectedSpace;\n let addToEndOnly = false;\n\n let firstAdded = false;\n let lastAdded = false;\n\n let beginningInterpolationIndex = beforeIndex;\n let endInterpolationIndex = afterIndex;\n if (ignoreDiscontinuities) {\n while (beginningInterpolationIndex >= 0 && data[beginningInterpolationIndex][1] === null) {\n beginningInterpolationIndex --;\n }\n while (endInterpolationIndex < data.length && data[endInterpolationIndex][1] === null) {\n endInterpolationIndex++;\n }\n }\n\n if (swap) {\n inSelectedSpace = swap.data;\n if (swap.lastAdded) {\n inSelectedSpace.pop();\n }\n if (minX === swap.minX) {\n addToEndOnly = true;\n }\n if (beforeIndex !== swap.beforeIndex) {\n addToEndOnly = false;\n if (swap.firstAdded) {\n inSelectedSpace.shift();\n }\n let index = swap.beforeIndex;\n while (index >= 0 && inSelectedSpace.length && inSelectedSpace[0][0] >= minX) {\n if (!ignoreDiscontinuities || data[index][1] || data[index][1] === 0) {\n inSelectedSpace.unshift(data[index]);\n }\n index --;\n }\n while (index < data.length && inSelectedSpace.length && inSelectedSpace[0][0] < minX) {\n inSelectedSpace.shift();\n index ++;\n }\n }\n\n if (ignoreDiscontinuities && !swap.ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n\n if (beforeIndex === swap.beforeIndex && swap.firstAdded) {\n firstAdded = true;\n\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (beginningInterpolationIndex === -1 && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, null];\n } else {\n if (square && inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, data[beginningInterpolationIndex][1]];\n } else {\n if (inSelectedSpace.length) {\n inSelectedSpace[0] = [minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)];\n }\n }\n }\n if (data[beforeIndex + 1][0] === inSelectedSpace[0][0] && data[beforeIndex + 1][1] === inSelectedSpace[0][1]) {\n firstAdded = false;\n }\n }\n let lastIncluded = swap.afterIndex;\n if (swap.ignoreDiscontinuities && !ignoreDiscontinuities) {\n let nullIndex = beforeIndex + 1;\n let selectedIndex = 0;\n if (firstAdded) {\n selectedIndex ++;\n }\n while (selectedIndex <= inSelectedSpace.length && nullIndex < data.length && nullIndex < afterIndex) {\n if (data[nullIndex][0] <= maxX && data[nullIndex][1] === null && (!inSelectedSpace[selectedIndex] || inSelectedSpace[selectedIndex][0] !== data[nullIndex][0] || inSelectedSpace[selectedIndex][1] !== data[nullIndex][1])) {\n inSelectedSpace.splice(selectedIndex, 0, data[nullIndex]);\n if (nullIndex >= lastIncluded) {\n lastIncluded = nullIndex + 1;\n }\n }\n nullIndex ++;\n selectedIndex ++;\n }\n }\n\n let dataIndex = lastIncluded || 0;\n while (dataIndex < data.length && data[dataIndex][0] <= maxX) {\n if (data[dataIndex][0] >= minX) {\n if (!ignoreDiscontinuities || data[dataIndex][1] || data[dataIndex][1] === 0) {\n inSelectedSpace.push(data[dataIndex]);\n }\n }\n dataIndex ++;\n }\n while (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] > maxX) {\n inSelectedSpace.pop();\n }\n\n } else {\n inSelectedSpace = data.slice(beforeIndex + 1, afterIndex);\n if (ignoreDiscontinuities) {\n inSelectedSpace = inSelectedSpace.filter(([_x, y]) => (y !== null && y !== undefined));\n }\n }\n\n if (!inSelectedSpace.length) {\n if (square) {\n if (beginningInterpolationIndex < 0) {\n inSelectedSpace = [[minX, null], [maxX, null]];\n } else {\n inSelectedSpace = [[minX, data[beginningInterpolationIndex][1]], [maxX, data[beginningInterpolationIndex][1]]];\n }\n } else {\n inSelectedSpace = [[minX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, minX)], [maxX, interpolate(data, beginningInterpolationIndex, endInterpolationIndex, maxX)]];\n }\n firstAdded = true;\n lastAdded = true;\n }\n\n if (!addToEndOnly) {\n let interpolationIndex = beforeIndex + 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex < data.length && data[interpolationIndex][1] === null) {\n interpolationIndex ++;\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[0][0] > minX) {\n firstAdded = true;\n if (beginningInterpolationIndex === -1) {\n inSelectedSpace.unshift([minX, null]);\n } else {\n if (square) {\n inSelectedSpace.unshift([minX, data[beginningInterpolationIndex][1]]);\n } else {\n inSelectedSpace.unshift([minX, interpolate(data, beginningInterpolationIndex, interpolationIndex, minX)]);\n }\n }\n }\n }\n\n if (inSelectedSpace.length && inSelectedSpace[inSelectedSpace.length - 1][0] < maxX) {\n lastAdded = true;\n\n let interpolationIndex = afterIndex - 1;\n if (ignoreDiscontinuities) {\n while (interpolationIndex >= 0 && data[interpolationIndex][1] === null) {\n interpolationIndex --;\n }\n }\n\n if (endInterpolationIndex === data.length) {\n inSelectedSpace.push([maxX, null]);\n } else {\n if (square) {\n inSelectedSpace.push([maxX, inSelectedSpace[inSelectedSpace.length - 1][1]]);\n } else {\n inSelectedSpace.push([maxX, interpolate(data, interpolationIndex, endInterpolationIndex, maxX)]);\n }\n }\n }\n\n if (inSelectedSpace.length === 1) {\n let begPoint;\n let endPoint;\n if (square) {\n if (beginningInterpolationIndex < 0) {\n begPoint = [minX, null];\n } else {\n begPoint = [minX, data[beginningInterpolationIndex][1]];\n }\n endPoint = [maxX, inSelectedSpace[0][1]];\n } else {\n begPoint = [minX, interpolate(data, beginningInterpolationIndex, beforeIndex + 1, minX)];\n endPoint = [maxX, interpolate(data, afterIndex - 1, endInterpolationIndex, maxX)];\n }\n inSelectedSpace.unshift(begPoint);\n inSelectedSpace.push(endPoint);\n firstAdded = true;\n lastAdded = true;\n }\n\n return {\n data: inSelectedSpace,\n minX,\n maxX,\n beforeIndex,\n afterIndex,\n firstAdded,\n lastAdded,\n ignoreDiscontinuities\n //previouslyEmpty: false\n };\n}\n\nfunction undateify(potentialDate) {\n if (potentialDate instanceof Date) {\n return potentialDate.valueOf();\n }\n\n return potentialDate;\n}\n\n/**\n * Finds the point at the boundary via interpolation\n *\n * @param {Array<Array<Number>>} data\n * @param {Number} firstIndex\n * @param {Number} secondIndex\n * @param {Number} boundary\n * @return {null|*}\n */\nfunction interpolate(data, firstIndex, secondIndex, boundary) {\n if (firstIndex < 0 || secondIndex < 0) {\n return null;\n }\n\n if (firstIndex >= data.length || secondIndex >= data.length) {\n return null;\n }\n\n if (firstIndex === secondIndex) {\n return data[firstIndex][1];\n }\n\n const [xBefore, yBefore] = data[firstIndex];\n const [xAfter, yAfter] = data[secondIndex];\n\n if (boundary === xBefore && yBefore !== null) {\n return yBefore;\n }\n\n if (boundary === xAfter && yAfter !== null) {\n return yAfter;\n }\n\n if (yBefore === null || yAfter === null) {\n return null;\n }\n\n const percent = (boundary - xBefore)/(xAfter - xBefore);\n if (percent < 0 || percent > 1) {\n return null;\n }\n\n return percent*(yAfter - yBefore) + yBefore;\n}\n","/**\n * Scales y min and max bounds according to linear or log\n *\n * @param {Number} minY\n * @param {Number} maxY\n * @param {'linear'|'log'} scale\n * @return {{minY: Number, maxY: Number}}\n */\nexport default function scaleBounds({ minY, maxY, scale }) {\n if (scale === 'log') {\n maxY = Math.log10(maxY);\n\n if (minY <= 0) {\n if (maxY > 0) {\n minY = -maxY;\n } else {\n minY = 2*maxY;\n }\n } else {\n minY = Math.log10(minY);\n }\n }\n\n return {\n minY,\n maxY\n };\n}\n","import scaleBounds from '../../renderer/scale_bounds';\nimport RustAPI from '../rust_api';\n\n\nfunction selectedSpaceToRenderSpaceInPlace({ data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale }, { nullMask, yValues, minYValues, maxYValues }) {\n let i = 0;\n let prevI = i - 1;\n\n for (let pixelX = 0; pixelX < renderWidth; pixelX++) {\n // find the x value that corresponds to the x pixel\n const x = (pixelX/(renderWidth - 1))*(maxX - minX) + minX;\n\n // set i such that data[i][0] < x <= data[i+1][0]\n let minSeenY = null;\n let maxSeenY = null;\n\n if (i > 0 && i <= data.length && data[i - 1][1] === null) {\n i--;\n }\n\n if (i < data.length - 2 && data[i + 1][0] < x) {\n i++;\n }\n\n for (i; i < data.length - 2 && data[i + 1][0] < x; i++) {\n const curY = data[i][1];\n\n if (curY === null) {\n continue;\n }\n\n if (minSeenY === null || curY < minSeenY) {\n minSeenY = curY;\n }\n\n if (maxSeenY === null || curY > maxSeenY) {\n maxSeenY = curY;\n }\n }\n\n minYValues[pixelX] = minSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(minSeenY) : minSeenY) - minY)/(maxY - minY));\n maxYValues[pixelX] = maxSeenY === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(maxSeenY) : maxSeenY) - minY)/(maxY - minY));\n\n // pass any discontinuities along\n if (i >= data.length - 1 || data[i][1] === null || data[i + 1][1] === null) {\n const y = i >= data.length - 1 ? null : data[i][1];\n\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n\n i++;\n\n continue;\n }\n\n // interpolate\n const [xBefore, yBefore] = data[i];\n const [xAfter, yAfter] = data[i + 1];\n\n const percent = (x - xBefore) / (xAfter - xBefore);\n let y = percent * (yAfter - yBefore) + yBefore;\n\n // we're at the first point after the direction changed. Don't interpolate\n if (prevI !== i) {\n y = yBefore;\n }\n\n // // two x's with the same value; common in area charts\n // // to avoid this from having gotten skipped over, save in either min or max as appropriate\n // if (i > 0 && data[i - 1][0] === data[i][0]) {\n // // 0: minY a\n // // 1: original a\n // // 2: minY b\n // // 3: original b\n //\n // const [xBeforeOffset, yBeforeOffset] = data[i - 1];\n // const [xAfter, yAfter] = data[i + 1];\n // }\n\n yValues[pixelX] = y === null ? 0 : renderHeight*(1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY));\n nullMask[pixelX] = ((y === null) << 0) | ((minSeenY === null) << 1) | ((maxSeenY === null) << 2);\n\n prevI = i;\n }\n}\n\n/**\n * Convert from selected space to value space\n *\n * @param data\n * @param {Object} [swap]\n * @param {Number} renderWidth - width, in pixels, of the area in which the graph is rendered\n * @param {Number} renderHeight - height, in pixels, of the area in which the graph is rendered\n * @param {Number} minX - the minimum x value that is rendered\n * @param {Number} maxX - the maximum x value that is rendered\n * @param {Number} minY - the minimum y value that is rendered\n * @param {Number} maxY - the maximum y value that is rendered\n * @param {'log'|'linear'} scale\n * @param {Boolean} [dataChanged] - if true, will not rely on the prior data state from swap being accurate\n * @return {{nullMask: Uint8Array, maxYValues: Float64Array, minYValues: Float64Array, yValues: Float64Array, dataF64: Float64Array, dataNullMask: Uint8Array}}\n */\nexport default function selectedSpaceToRenderSpace({ data, swap, renderWidth, renderHeight, minX, maxX, minY, maxY, scale, dataChanged }) {\n if (swap && swap.yValues.length !== renderWidth) {\n swap = null;\n }\n\n const nullMask = (swap && swap.nullMask) || new Uint8Array(renderWidth);\n nullMask.fill(0);\n const yValues = new Float64Array(renderWidth);\n const minYValues = new Float64Array(renderWidth);\n const maxYValues = new Float64Array(renderWidth);\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const inParams = { data, renderWidth, renderHeight, minX, maxX, minY, maxY, scale };\n\n let dataF64, dataNullMask;\n\n if (RustAPI()) {\n let copyIndexStart = 0;\n\n const hasSwap = swap && swap.dataNullMask && swap.dataF64;\n const useSwap = !dataChanged && hasSwap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n if (!useSwap || swap.dataNullMask.length < data.length) {\n const extraSpaceFactor = 1.25;\n dataF64 = new Float64Array(Math.floor(data.length*2*extraSpaceFactor));\n dataNullMask = new Uint8Array(Math.floor(data.length*extraSpaceFactor));\n\n if (useSwap) {\n dataNullMask.set(swap.dataNullMask);\n dataF64.set(swap.dataF64);\n }\n } else {\n dataF64 = swap.dataF64;\n dataNullMask = swap.dataNullMask;\n }\n\n if (useSwap) {\n copyIndexStart = Math.max(swap.length - 1, 0);\n }\n\n for (let i = copyIndexStart; i < data.length; i++) {\n dataF64[2*i] = data[i][0];\n dataF64[2*i + 1] = data[i][1];\n\n if (data[i][1] === null) {\n dataNullMask[i] = 1;\n } else {\n dataNullMask[i] = 0;\n }\n }\n RustAPI().selected_space_to_render_space(data.length, dataF64, dataNullMask, inParams, nullMask, yValues, minYValues, maxYValues);\n } else {\n selectedSpaceToRenderSpaceInPlace(inParams, { nullMask, yValues, minYValues, maxYValues });\n }\n\n return {\n nullMask,\n yValues,\n minYValues,\n maxYValues,\n dataF64,\n dataNullMask,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Flattens simple data\n * Returns an array of tuples (x value, simple point)\n *\n * @param simpleData\n * @param series\n * @param inDataSpace\n * @return {[]}\n */\nexport default function flattenSimpleData(simpleData, {series, inDataSpace }) {\n const flattened = [];\n let fI = 0;\n\n for (let point of simpleData) {\n const yValue = extractYValue(point, series);\n\n if (series.yKey && Array.isArray(yValue)) {\n for (let subpoint of point[series.yKey]) {\n if (series.ignoreDiscontinuities && typeof subpoint[series.yKey] !== 'number' && !Array.isArray(subpoint)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, subpoint]);\n }\n\n continue;\n }\n\n if (series.ignoreDiscontinuities && (yValue === undefined || yValue === null)) {\n continue;\n }\n\n const x = inDataSpace[fI++][0];\n\n if (series.square && flattened.length > 0) {\n flattened.push([x, flattened[flattened.length - 1][1]]);\n }\n\n flattened.push([x, point]);\n }\n\n if (flattened.length !== inDataSpace.length) {\n console.warn('Flattening didn\\'t give the same length as it has in data space'); // eslint-disable-line no-console\n }\n\n return flattened;\n}\n\nexport function extractYValue(point, series) {\n if (series.yKey) {\n return point[series.yKey];\n }\n\n if (Array.isArray(point)) {\n if (point.length === 1) {\n return point[0];\n } else {\n return point[1];\n }\n }\n\n return point;\n}\n\nexport function extractXValue(point, series) {\n if (series.xKey) {\n return point[series.xKey];\n }\n\n if (Array.isArray(point)) {\n return point[0];\n }\n\n return point;\n}\n","import binarySearch from '../helpers/binary_search';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport flattenSimpleData, {extractXValue, extractYValue} from '../helpers/flatten_simple_data';\nimport {getBarWidths} from '../renderer/draw_bars';\n\nconst DISTANCE_THRESHOLD = 20;\n\n/**\n * Figures out the tooltip state\n *\n * @param {Boolean} mousePresent\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Array<Object>} series\n * @param {Set} alwaysTooltipped\n * @param {Array<Object>} savedTooltips\n * @param {Boolean} [allTooltipped]\n * @param {Number} closestSpacing\n * @return {{mouseX: *, mouseY: *, elementWidth: number, elementHeight: number, tooltips: any[]}}\n */\nexport default function calculateTooltipState({mousePresent, mouseX, mouseY, sizing, series, alwaysTooltipped, savedTooltips, allTooltipped, closestSpacing }) {\n // filter out saved tooltips for nonexistent series\n savedTooltips = savedTooltips.filter((tooltip) => tooltip.series.axis);\n\n for (let savedTooltip of savedTooltips) {\n moveTooltip({ mouseX, mouseY, sizing}, savedTooltip);\n }\n\n if (!mousePresent) {\n return {\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n tooltips: [...savedTooltips]\n };\n }\n\n const tooltips = [];\n\n let minDistance = Infinity;\n\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n if (singleSeries.hidden) {\n continue;\n }\n\n const axis = singleSeries.axis;\n\n const scale = axis.scale;\n const bounds = axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const trueX = mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n\n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n if (!closestPoint) {\n continue;\n }\n\n const [x, y] = closestPoint;\n\n if (x === null) {\n continue;\n }\n\n let pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n if (pixelY > sizing.elementHeight || pixelY < 0) {\n continue;\n }\n\n const ignoreYDistance = alwaysTooltipped.has(singleSeries) || allTooltipped;\n let xDistanceThreshold = DISTANCE_THRESHOLD;\n let yDistanceThreshold = DISTANCE_THRESHOLD;\n let distanceThreshold = DISTANCE_THRESHOLD;\n\n if (singleSeries.rendering === 'bar') {\n const indexInAxis = singleSeries.axis.series.indexOf(singleSeries);\n const axisSeriesCount = singleSeries.axis.series.length;\n\n const { totalBarWidth, barWidth } = getBarWidths({\n closestSpacing,\n bounds,\n sizing,\n axisSeriesCount\n });\n\n // currently, pixelX is the center of all the bars\n // shift it to start at the far left, then shift it to the center of the individual bar\n pixelX -= totalBarWidth/2/sizing.pixelRatio;\n pixelX += (barWidth*(indexInAxis + 0.5))/sizing.pixelRatio;\n\n xDistanceThreshold = barWidth/2/sizing.pixelRatio;\n yDistanceThreshold = 100;\n distanceThreshold = xDistanceThreshold + yDistanceThreshold;\n }\n\n const xDistance = Math.abs(pixelX - mouseX);\n const yDistance = Math.abs(pixelY - mouseY);\n const distance = Math.sqrt((xDistance)**2 + (pixelY - mouseY)**2);\n\n if (xDistance > xDistanceThreshold || (!ignoreYDistance && yDistance > yDistanceThreshold) || (!ignoreYDistance && distance > distanceThreshold)) {\n continue;\n }\n\n let xLabel, yLabel;\n\n const simpleData = singleSeries.simpleData || singleSeries.data;\n\n const enumLike = simpleData.length && !!singleSeries.hasEnum;\n if (singleSeries.xLabel || singleSeries.yLabel || enumLike) {\n let simplePoint;\n\n if (simpleData.length === data.length) {\n simplePoint = simpleData[closestIndex];\n } else {\n const flattenedData = flattenSimpleData(simpleData, { series: singleSeries, inDataSpace: data });\n\n simplePoint = flattenedData[closestIndex][1];\n }\n\n if (singleSeries.xLabel) {\n xLabel = simplePoint[singleSeries.xLabel];\n } else if (singleSeries.hasXEnum) {\n xLabel = extractXValue(simplePoint, singleSeries);\n }\n\n if (singleSeries.yLabel) {\n yLabel = simplePoint[singleSeries.yLabel];\n } else if (enumLike) {\n yLabel = extractYValue(simplePoint, singleSeries);\n }\n }\n\n if (distance < minDistance) {\n minDistance = distance;\n }\n\n let color = getColor(singleSeries.color, i, singleSeries.multigrapherSeriesIndex);\n if (y < 0 && singleSeries.negativeColor) {\n color = singleSeries.negativeColor;\n } else if (y === 0 && singleSeries.zeroLineColor) {\n color = singleSeries.zeroLineColor;\n }\n\n tooltips.push({\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n x,\n y,\n color,\n distance,\n xDistance,\n index: i,\n series: singleSeries,\n xLabel,\n yLabel,\n fullYPrecision: singleSeries.fullYPrecision,\n ignoreYDistance\n });\n }\n\n const unsavedTooltips = tooltips.filter(({ distance, ignoreYDistance }) => {\n return distance === minDistance || ignoreYDistance;\n }).sort((a, b) => b.distance - a.distance);\n\n return {\n mousePresent,\n mouseX,\n mouseY,\n elementWidth: sizing.elementWidth,\n elementHeight: sizing.elementHeight,\n unsavedTooltipsCount: unsavedTooltips.length,\n tooltips: [...savedTooltips, ...unsavedTooltips]\n };\n}\n\n/**\n * Recalculates the tooltip position, given the new sizing, bounds, etc.\n *\n * @param {Number} mouseX\n * @param {Number} mouseY\n * @param {Object} sizing\n * @param {Object} tooltip - The tooltip object to move\n */\nexport function moveTooltip({ mouseX, mouseY, sizing }, tooltip) {\n const { x, y } = tooltip;\n\n const scale = tooltip.series.axis.scale;\n const bounds = tooltip.series.axis.currentBounds;\n const { minY, maxY } = scaleBounds({...bounds, scale });\n\n const pixelX = (x - bounds.minX)/(bounds.maxX - bounds.minX) * sizing.elementWidth;\n const pixelY = (1 - ((scale === 'log' ? Math.log10(y) : y) - minY)/(maxY - minY)) * sizing.elementHeight;\n\n const distance = Math.sqrt((pixelX - mouseX)**2 + (pixelY - mouseY)**2);\n const xDistance = Math.abs(pixelX - mouseX);\n\n Object.assign(tooltip, {\n pixelWidth: sizing.elementWidth,\n pixelX: pixelX,\n pixelY: isNaN(pixelY) ? sizing.elementHeight/2 : pixelY,\n xDistance,\n distance\n });\n}\n\nexport function toggleTooltipSaved({ currentTooltips, savedTooltips }) {\n if (!currentTooltips.length) {\n return savedTooltips;\n }\n\n const lastTooltip = currentTooltips[currentTooltips.length - 1];\n if (lastTooltip.xDistance > DISTANCE_THRESHOLD || (!lastTooltip.ignoreYDistance && lastTooltip.distance > DISTANCE_THRESHOLD)) {\n return savedTooltips;\n }\n\n const currentTooltipIndex = savedTooltips.findIndex((tooltip) => {\n return tooltip.x === lastTooltip.x && tooltip.y === lastTooltip.y;\n });\n\n if (currentTooltipIndex === -1) {\n return [...savedTooltips, lastTooltip];\n } else {\n return savedTooltips.filter((_, index) => index !== currentTooltipIndex);\n }\n}\n","const BOUND_CALCULATORS = {\n all: () => {},\n lastMinute: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*1000, globalBounds.minX)\n };\n },\n last10Minutes: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 10*60*1000, globalBounds.minX)\n };\n },\n lastHour: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 60*60*1000, globalBounds.minX)\n };\n },\n lastDay: (globalBounds) => {\n if (!globalBounds.dates) {\n return;\n }\n\n return {\n minX: Math.max(new Date(globalBounds.maxX).valueOf() - 24*60*60*1000, globalBounds.minX)\n };\n }\n};\n\nexport default BOUND_CALCULATORS;\n","const BUCKETS_PER_PIXEL = 2;\nconst CONDENSE_THRESHOLD = 2;\n\n/**\n * Condenses the dataset down to a lower number of points to make subsequent operations more efficient\n * Will only condense when data length passes a given threshold\n * Note that this works best on datasets that are relatively evenly distributed across the x axis\n *\n * @param {Array<Array>} data\n * @param {{data: [], minX: Number, maxX: Number, length: Number}} swap\n * @param {Number} minX\n * @param maxX\n * @param renderWidth\n * @param dataChanged\n * @return {{data: [], minX: Number, maxX: Number, length: Number}}\n */\nexport default function condenseDataSpace({ data, swap, minX, maxX, renderWidth, dataChanged }) {\n const targetBucketCount = renderWidth*BUCKETS_PER_PIXEL;\n\n const useSwap = !dataChanged && swap && swap.minX === minX && swap.maxX <= maxX && swap.length <= data.length;\n\n let partiallyCondensedData;\n if (useSwap) {\n partiallyCondensedData = swap.data;\n\n if (data.length > swap.length) {\n // always overwrite the last in case it was mangled by the selected space interpolation\n if (data.length > 0 && partiallyCondensedData.length > 0) {\n partiallyCondensedData[partiallyCondensedData.length - 1] = data[swap.length - 1];\n }\n\n partiallyCondensedData = partiallyCondensedData.concat(data.slice(swap.length));\n }\n } else {\n partiallyCondensedData = [...data];\n }\n\n if (partiallyCondensedData.length / targetBucketCount < CONDENSE_THRESHOLD*2) { // * 2 because min and max\n return {\n data: partiallyCondensedData,\n minX,\n maxX,\n length: data.length\n };\n }\n\n const condensedData = [];\n const bucketSize = (maxX - minX)/targetBucketCount;\n let minInBucket = null;\n let maxInBucket = null;\n let currentBucketIndex = 0;\n\n // always add the first point so that x ranges are preserved\n if (data.length) {\n condensedData.push(data[0]);\n }\n\n for (let tuple of partiallyCondensedData) {\n const [x, y] = tuple;\n\n if (y === null) {\n continue;\n }\n\n const bucketIndex = Math.floor((x - minX)/bucketSize);\n\n if (bucketIndex !== currentBucketIndex) {\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n if (condensedData[condensedData.length - 1] !== minInBucket) {\n condensedData.push(minInBucket);\n }\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n minInBucket = null;\n maxInBucket = null;\n currentBucketIndex = bucketIndex;\n }\n\n if (!minInBucket || y < minInBucket[1]) {\n minInBucket = tuple;\n }\n\n if (!maxInBucket || y > maxInBucket[1]) {\n maxInBucket = tuple;\n }\n }\n\n if (minInBucket && maxInBucket) {\n if (minInBucket === maxInBucket) {\n condensedData.push(minInBucket);\n } else if (minInBucket[0] < maxInBucket[0]) {\n condensedData.push(maxInBucket, minInBucket);\n } else {\n condensedData.push(minInBucket, maxInBucket);\n }\n }\n\n // always add the last point so that x ranges are preserved\n if (data.length >= 2 && data[data.length - 1] !== minInBucket && data[data.length - 1] !== maxInBucket) {\n condensedData.push(data[data.length - 1]);\n }\n\n return {\n data: condensedData,\n minX,\n maxX,\n length: data.length\n };\n}\n","/**\n * Gets the proper name for a series\n *\n * @param {Object} singleSeries\n * @param {Number} index\n * @return {string}\n */\nexport default function nameForSeries(singleSeries, index) {\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = index.toString();\n }\n\n return name;\n}\n","export function selectedSpaceToBackgroundSpace({ data, background, minX, maxX }) {\n if (!background) {\n return null;\n }\n\n const conditions = [];\n for (let [key, color] of Object.entries(background)) {\n if (typeof color === 'object') {\n if (typeof color.evaluator !== 'function') {\n throw new Error('Invalid background declaration: ' + key + ' (evaluator must be a function)');\n }\n\n conditions.push(Object.assign({\n key,\n comparator: 'custom',\n comparedAgainst: null\n }, color));\n continue;\n }\n\n if (key === 'null') {\n conditions.push({\n evaluator: (y) => y === null && color,\n color,\n key,\n comparator: '=',\n comparedAgainst: null\n });\n continue;\n }\n\n const [comparator, value] = key.split(' ');\n if (!comparator || !value || isNaN(parseFloat(value))) {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n const parsedValue = parseFloat(value);\n\n let evaluator;\n if (comparator === '=') {\n evaluator = (y) => typeof y === 'number' && y === parsedValue && color;\n } else if (comparator === '<') {\n evaluator = (y) => typeof y === 'number' && y < parsedValue && color;\n } else if (comparator === '>') {\n evaluator = (y) => typeof y === 'number' && y > parsedValue && color;\n } else if (comparator === '<=') {\n evaluator = (y) => typeof y === 'number' && y <= parsedValue && color;\n } else if (comparator === '>=') {\n evaluator = (y) => typeof y === 'number' && y >= parsedValue && color;\n } else {\n throw new Error('Invalid background declaration: ' + key);\n }\n\n conditions.push({\n evaluator,\n color,\n key,\n comparator,\n comparedAgainst: parsedValue\n });\n }\n\n const inBackgroundSpace = [];\n let currentSection = null;\n\n for (let i = 0; i < data.length; i++) {\n let [x, y] = data[i];\n if (x instanceof Date) {\n x = x.valueOf();\n }\n\n for (let condition of currentSection ? [currentSection.condition, ...conditions] : conditions) {\n const color = condition.evaluator(y);\n\n if (currentSection) {\n if (currentSection.color === color) {\n break;\n }\n\n let interpolatedMaxX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (currentSection.condition.comparedAgainst === null) {\n interpolatedMaxX = x;\n } else if (y === null) {\n interpolatedMaxX = prevX;\n } else {\n interpolatedMaxX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n inBackgroundSpace.push({\n ...currentSection,\n maxX: interpolatedMaxX,\n maxXt: (interpolatedMaxX - minX)/(maxX - minX)\n });\n currentSection = null;\n }\n\n if (color) {\n let interpolatedMinX = x;\n if (i > 0) {\n let [prevX, prevY] = data[i - 1];\n if (prevX instanceof Date) {\n prevX = prevX.valueOf();\n }\n\n if (condition.comparedAgainst === null) {\n interpolatedMinX = prevX;\n } else if (prevY === null) {\n interpolatedMinX = x;\n } else {\n interpolatedMinX = prevX + (condition.comparedAgainst - prevY)/(y - prevY)*(x - prevX);\n }\n }\n\n currentSection = {\n minX: interpolatedMinX,\n minXt: (interpolatedMinX - minX)/(maxX - minX),\n color,\n condition\n };\n\n break;\n }\n }\n }\n\n if (currentSection) {\n inBackgroundSpace.push({\n ...currentSection,\n maxX: data[data.length - 1][0],\n maxXt: (data[data.length - 1][0] - minX)/(maxX - minX)\n });\n }\n\n return {\n data: inBackgroundSpace\n };\n}\n","import simpleSeriesToDataSpace from './space_conversions/simple_series_to_data_space';\nimport calculateDataBounds from './calculate_data_bounds';\nimport mergeBounds from './merge_bounds';\nimport expandBounds from './expand_bounds';\nimport selectionFromGlobalBounds from './selection_from_global_bounds';\nimport dataSpaceToSelectedSpace from './space_conversions/data_space_to_selected_space';\nimport selectedSpaceToRenderSpace from './space_conversions/selected_space_to_render_space';\nimport Eventable from '../eventable';\nimport boundCalculatorFromSelection from './bound_calculator_from_selection';\nimport calculateTooltipState, {toggleTooltipSaved} from './calculate_tooltip_state';\nimport getDefaultBoundsCalculator from './get_default_bounds_calculator';\nimport inferType from './infer_type';\nimport {SIMPLE_DATA_TYPES} from './data_types';\nimport generatorParamsEqual from '../helpers/generator_params_equal';\nimport findMatchingAxis from './find_matching_axis';\nimport {DPI_INCREASE} from '../renderer/size_canvas';\nimport {averageLoopTimes} from './average_loop_times';\nimport condenseDataSpace from './space_conversions/condense_data_space.js';\nimport calculateAnnotationsState from './calculate_annotations_state.js';\nimport {selectedSpaceToBackgroundSpace} from './space_conversions/selected_space_to_background_space.js';\nimport RustAPI, {RustAPIPromise} from './rust_api';\n\nexport default class StateController extends Eventable {\n\n constructor({ defaultBoundsCalculator, customBoundsSelectors, requireWASM, defaultShowIndividualPoints, defaultShowSidebar, defaultShowAnnotations, defaultShowOptions, syncPool, grapherID, sharedDataCache, sharedSubscriptions, fullscreen }) {\n super();\n\n this._requireWASM = requireWASM;\n if (requireWASM) {\n RustAPIPromise.then(() => {\n this._markDirty();\n });\n }\n\n this._series = [];\n this._seriesFromOriginalSeries = new Map();\n\n this._axes = [\n {\n series: [],\n scale: 'linear',\n side: 'left',\n axisIndex: 0\n }\n ];\n this._highlightedSeries = null;\n\n this._showIndividualPoints = defaultShowIndividualPoints || false;\n this._autoscaleY = true;\n this._percentile = 100;\n this._percentileAsymmetry = 0;\n this._showingOptions = defaultShowOptions;\n this._maxPrecision = false;\n this._showingSidebar = defaultShowSidebar || false;\n this._showingAnnotations = defaultShowAnnotations || false;\n this._grapherID = grapherID;\n this._fullscreen = fullscreen || false;\n\n this._alwaysTooltipped = new Set();\n this._tooltipState = {\n mousePresent: false,\n mouseX: 0,\n mouseY: 0,\n elementWidth: 0,\n elementHeight: 0,\n tooltips: []\n };\n this._contextMenuPosition = {\n x: 0,\n y: 0,\n showing: false,\n value: null\n };\n this._savedTooltips = [];\n this._draggingY = false;\n this._annotations = [];\n this._annotationsState = {\n elementWidth: 0,\n annotations: []\n };\n this._enumMap = {};\n this._hasXEnum = false;\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = 0;\n\n this._modifiedSeries = new Set();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n this.primaryRenderer = null;\n this.rangeGraphRenderer = null;\n\n this._boundsCalculator = getDefaultBoundsCalculator(defaultBoundsCalculator, customBoundsSelectors);\n this._boundsHistory = [this._boundsCalculator];\n this._boundsIndex = 0;\n\n this._dataCache = sharedDataCache || new Map();\n this._subscriptions = sharedSubscriptions || new Map();\n this._subscriptionsShared = !!sharedSubscriptions;\n this._observablesToSeries = new Map();\n this._generators = new Set();\n this._generatorsToSeries = new Map();\n this._generatorCallArgs = new Map();\n this._seriesChangedFromPromises = new Set();\n\n this._syncPool = syncPool;\n if (this._syncPool) {\n this._syncPool.add(this);\n }\n\n this._onDataChange();\n }\n\n dispose() {\n this.emit('dispose', this);\n\n this.clearListeners();\n\n if (!this._subscriptionsShared) {\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n this._subscriptions.clear();\n }\n\n for (let singleSeries of this._series) {\n this._removeSeries(singleSeries);\n }\n\n if (this._syncPool) {\n this._syncPool.remove(this);\n }\n\n this.disposed = true;\n }\n\n setSeries(series) {\n const userSeries = this._series.filter((singleSeries) => singleSeries.userCreated);\n const propsSeries = this._series.filter((singleSeries) => !singleSeries.userCreated);\n\n if (series.length === propsSeries.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._series[i].originalSeries) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n } else {\n this._mustResize = this._mustResize || this._fullscreen;\n }\n\n const newSeriesSet = new Set(series);\n for (let singleSeries of propsSeries) {\n if (!newSeriesSet.has(singleSeries.originalSeries)) {\n this._removeSeries(singleSeries);\n }\n }\n\n this._series.splice(0);\n for (let i = 0; i < series.length; i++) {\n const originalSeries = series[i];\n\n let singleSeries = this._seriesFromOriginalSeries.get(originalSeries);\n if (!singleSeries) {\n singleSeries = {\n ...originalSeries,\n originalSeries\n };\n this._seriesFromOriginalSeries.set(originalSeries, singleSeries);\n\n if (singleSeries.defaultAlwaysTooltipped) {\n this._alwaysTooltipped.add(singleSeries);\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n }\n }\n\n singleSeries.index = i;\n this._series.push(singleSeries);\n this._assignAxisTo(singleSeries);\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n }\n }\n\n for (let i = 0; i < userSeries.length; i++) {\n const singleSeries = userSeries[i];\n singleSeries.index = i + series.length;\n this._series.push(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series);\n\n this._dataChanged = true;\n this._markDirty();\n }\n\n _markDirty() {\n if (this._frameRequested) {\n return;\n }\n\n if (this._requireWASM && !RustAPI) {\n return;\n }\n\n const frameRequestStart = performance.now();\n this._frameRequested = true;\n requestAnimationFrame(() => {\n if (this.disposed) {\n return;\n }\n\n const frameExecutionStart = performance.now();\n\n const dataProcessingStart = performance.now();\n if (this._dataChanged) {\n this._onDataChange();\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else if (this._modifiedSeries.size) {\n this._onDataAdd(this._modifiedSeries);\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n } else {\n if (this._primarySizeChanged) {\n this._calculatePrimarySizeDependents();\n this._mustRerender = true;\n }\n if (this._rangeGraphSizeChanged) {\n this._calculateRangeGraphSizeDependents();\n this._mustRerender = true;\n }\n }\n const dataProcessingEnd = performance.now();\n\n const renderPipelineStart = performance.now();\n if (this._mustRerender) {\n this._render();\n }\n const renderPipelineEnd = performance.now();\n\n const generatorsStart = performance.now();\n if (this._mustCallGenerators) {\n this._callGenerators();\n }\n const generatorsEnd = performance.now();\n\n const tooltipStart = performance.now();\n if (this._tooltipsChanged) {\n this._recalculateTooltips();\n }\n const tooltipEnd = performance.now();\n\n const contextMenuStart = performance.now();\n if (this._contextMenuChanged) {\n this._recalculateContextMenu();\n }\n const contextMenuEnd = performance.now();\n\n const annotationStart = performance.now();\n if (this._annotationsChanged) {\n this._recalculateAnnotations();\n }\n const annotationEnd = performance.now();\n\n if (this._mustResize) {\n this.primaryRenderer.resizeDebounced();\n this.rangeGraphRenderer && this.rangeGraphRenderer.resizeDebounced();\n }\n\n this._frameRequested = false;\n this._mustRerender = false;\n this._dataChanged = false;\n this._primarySizeChanged = false;\n this._rangeGraphSizeChanged = false;\n this._modifiedSeries.clear();\n this._seriesChangedFromPromises.clear();\n this._tooltipsChanged = false;\n this._contextMenuChanged = false;\n this._annotationsChanged = false;\n this._mustCallGenerators = false;\n this._mustResize = false;\n\n const callbacksStart = performance.now();\n for (let emission of [...Object.values(this._deferredPriorityEmissions), ...Object.values(this._deferredEmissions)]) {\n this.emit(...emission);\n }\n const callbacksEnd = performance.now();\n this._deferredEmissions = {};\n this._deferredPriorityEmissions = {};\n\n const completionTime = performance.now();\n const loopTime = {\n frameExecution: completionTime - frameExecutionStart,\n frameRequestAndExecution: completionTime - frameRequestStart,\n generators: generatorsEnd - generatorsStart,\n dataProcessing: dataProcessingEnd - dataProcessingStart,\n renderPipeline: renderPipelineEnd - renderPipelineStart,\n tooltips: tooltipEnd - tooltipStart,\n contextMenu: contextMenuEnd - contextMenuStart,\n annotations: annotationEnd - annotationStart,\n callbacks: callbacksEnd - callbacksStart\n };\n this.lastLoopTime = loopTime;\n if (this._timingFrameCount) {\n if (this._timingBuffer.length < this._timingFrameCount) {\n this._timingBuffer.push(loopTime);\n } else {\n this._timingBuffer[this._timingIndex % this._timingFrameCount] = loopTime;\n }\n this._timingIndex++;\n }\n this.emit('render_time', completionTime - frameExecutionStart, loopTime);\n });\n }\n\n deferredEmit(...args) {\n this._deferredEmissions[args[0]] = args;\n }\n\n deferredPriorityEmit(...args) {\n this._deferredPriorityEmissions[args[0]] = args;\n }\n\n _seriesToSimpleData(singleSeries) {\n const type = inferType(singleSeries);\n if (SIMPLE_DATA_TYPES.includes(type)) {\n return singleSeries.data;\n }\n\n // get a reference to whatever you already have\n let currentData = this._dataCache.get(singleSeries.data);\n\n if (currentData && this._seriesChangedFromPromises.has(singleSeries.data)) {\n return currentData;\n }\n\n if (!currentData) {\n currentData = [];\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n }\n\n if (type === 'object_observable' || type === 'tuple_observable') {\n let sameDataSet = this._observablesToSeries.get(singleSeries.data);\n if (sameDataSet) {\n const firstSameDataSeries = sameDataSet.values().next().value;\n currentData = firstSameDataSeries.simpleData;\n if (!currentData) {\n throw new Error(`Cannot find simpleData in ${firstSameDataSeries.name || firstSameDataSeries.yKey || firstSameDataSeries.data}`);\n }\n this._dataCache.set(singleSeries.data, currentData);\n singleSeries.simpleData = currentData;\n } else {\n sameDataSet = new Set();\n singleSeries.simpleData = currentData;\n this._observablesToSeries.set(singleSeries.data, sameDataSet);\n }\n\n sameDataSet.add(singleSeries);\n\n this._listenToObservableData({\n observable: singleSeries.data,\n currentData\n });\n }\n\n if (type === 'generator') {\n if (!this._generatorsToSeries.has(singleSeries.data)) {\n this._generatorsToSeries.set(singleSeries.data, new Set());\n }\n\n this._generatorsToSeries.get(singleSeries.data).add(singleSeries);\n\n if (!this._generators.has(singleSeries.data)) {\n this._generators.add(singleSeries.data);\n this._callGenerator(singleSeries.data);\n }\n }\n\n // return whatever you have; it'll fetch more in the background\n return currentData;\n }\n\n _listenToPromise(singleSeries, dataPromise) {\n dataPromise.then((resolved) => {\n this._dataCache.set(singleSeries.data, resolved);\n singleSeries.simpleData = resolved;\n this._seriesChangedFromPromises.add(singleSeries.data);\n this._dataChanged = true;\n this._markDirty();\n });\n }\n\n _listenToObservableData({ observable, currentData }) {\n if (this._subscriptions.has(observable)) { // someone else already listened to it\n return;\n }\n this._subscriptions.set(observable, true);\n\n // listen to the new data\n const listener = observable.observe((point) => {\n if (Array.isArray(point)) {\n for (let datum of point) {\n currentData.push(datum);\n }\n } else {\n currentData.push(point);\n }\n\n this.emit('observable_modified', observable);\n\n this.markObservableModified(observable);\n });\n this._subscriptions.set(observable, listener);\n }\n\n markObservableModified(observable) {\n if (!this._observablesToSeries.has(observable)) {\n return;\n }\n\n for (let singleSeries of this._observablesToSeries.get(observable)) {\n this._modifiedSeries.add(singleSeries);\n }\n this._markDirty();\n }\n\n _unsubscribeFromStaleSeries() {\n const currentSeries = new Set(this._series);\n for (let [observable, seriesSet] of this._observablesToSeries) {\n let stillHasListener = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasListener = true;\n break;\n }\n }\n\n if (!stillHasListener) {\n this._subscriptions.get(observable).unsubscribe();\n this._subscriptions.delete(observable);\n this._observablesToSeries.delete(observable);\n }\n }\n\n for (let [generator, seriesSet ] of this._generatorsToSeries) {\n let stillHasSeries = false;\n\n for (let singleSeries of seriesSet) {\n if (currentSeries.has(singleSeries)) {\n stillHasSeries = true;\n break;\n }\n }\n\n if (!stillHasSeries) {\n this._generatorsToSeries.delete(generator);\n this._generators.delete(generator);\n this._generatorCallArgs.delete(generator);\n }\n }\n }\n\n async _callGenerator(generator) {\n const parameters = {\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n sizing: this.primaryRenderer.sizing\n };\n\n if (generatorParamsEqual(this._generatorCallArgs.get(generator), parameters)) {\n return;\n }\n this._generatorCallArgs.set(generator, parameters);\n\n // Note: potential race condition if generator is stupid. For now, we'll rely on generator being smart\n // Race condition: a new, faster one runs before completed\n const data = await Promise.resolve(generator(parameters));\n\n // do nothing if the generator returned nothing\n if (!data) {\n return;\n }\n\n // because calling the generator may have taken some time, check that there are still listeners for it\n if (!this._generatorsToSeries.has(generator)) {\n return;\n }\n\n this._dataChanged = true;\n this._markDirty();\n\n if (typeof data.observe === 'function') {\n const currentData = [];\n this._dataCache.set(generator, currentData);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = currentData;\n }\n\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n if (!this._observablesToSeries.has(data)) {\n this._observablesToSeries.set(data, new Set());\n }\n\n this._observablesToSeries.get(data).add(singleSeries);\n }\n\n this._listenToObservableData({\n observable: data,\n currentData\n });\n } else {\n this._dataCache.set(generator, data);\n for (let singleSeries of this._generatorsToSeries.get(generator)) {\n singleSeries.simpleData = data;\n }\n }\n }\n\n _callGenerators() {\n for (let generator of this._generators) {\n this._callGenerator(generator);\n }\n }\n\n _recalculateTooltips() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._tooltipState = calculateTooltipState({\n mousePresent: this._tooltipState.mousePresent,\n mouseX: this._tooltipState.mouseX,\n mouseY: this._tooltipState.mouseY,\n sizing: this.primaryRenderer.sizing,\n series: this._series,\n alwaysTooltipped: this._alwaysTooltipped,\n savedTooltips: this._savedTooltips,\n allTooltipped: this._tooltipAllNext,\n closestSpacing: this._globalBounds.closestSpacing\n });\n this._tooltipAllNext = false;\n this.deferredEmit('tooltip_state_changed', this._tooltipState, this._tooltipStateArg);\n this._tooltipStateArg = null;\n }\n \n _recalculateContextMenu() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n let value = null;\n let newX = null;\n \n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n \n newX = this._contextMenuPosition.x - boundingRect.left;\n \n // if it's on the right side, move it to the left one width\n if (this._contextMenuPosition.x > (boundingRect.right - sizing.elementWidth) * 2) newX -= 130;\n\n if (series.xKey === 'timestamp' || series.xKey === 'time' || series.xKey === 'date') {\n value = new Date((this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX);\n } else {\n value = (this._contextMenuPosition.x - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n }\n }\n this._contextMenuPosition = {\n x: newX,\n y: this._contextMenuPosition.y - boundingRect.top,\n showing: this._contextMenuPosition.showing,\n value: value\n };\n this.deferredEmit('context_menu_position_changed', this._contextMenuPosition);\n }\n\n _recalculateAnnotations() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this._annotationsState = calculateAnnotationsState({\n annotations: this._annotations,\n series: this._series,\n sizing: this.primaryRenderer.sizing,\n selection: this._selection\n });\n this.deferredEmit('annotations_changed', this._annotationsState);\n }\n\n _onDataChange() {\n this._expandYWith = [];\n const dataBoundsList = [];\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n singleSeries.inDataSpace = simpleSeriesToDataSpace({\n ...singleSeries,\n data: simpleData\n }, {\n stateController: this\n });\n singleSeries.simpleDataSliceStart = simpleData.length;\n singleSeries.dataBounds = calculateDataBounds(singleSeries.inDataSpace);\n if (singleSeries.rendering === 'bar') {\n singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n dataBoundsList.push(singleSeries.dataBounds);\n\n if (singleSeries.expandYWith) {\n this._expandYWith.push(singleSeries.expandYWith);\n }\n }\n\n this._unsubscribeFromStaleSeries();\n\n this._dataBounds = mergeBounds(dataBoundsList);\n\n this._recalculateSelection({ disableSwap: true});\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n }\n\n this._recalculateAxisBounds();\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n this._calculatePrimarySizeDependents(singleSeries, { dataChanged: true });\n this._calculateRangeGraphSizeDependents(singleSeries, { dataChanged: true });\n }\n }\n\n _onDataAdd(modifiedSeries) {\n const newData = new Map();\n const modifiedAxes = new Set();\n\n const modifiedSeriesAndDependents = new Set();\n for (let singleSeries of modifiedSeries) {\n modifiedSeriesAndDependents.add(singleSeries);\n }\n\n for (let singleSeries of modifiedSeries) {\n modifiedAxes.add(singleSeries.axis);\n\n if (!singleSeries.inDataSpace) {\n throw new Error('inDataSpace must be present for onDataAdd to be called');\n }\n\n const simpleData = this._seriesToSimpleData(singleSeries);\n\n let prevY;\n if (singleSeries.inDataSpace.length) {\n prevY = singleSeries.inDataSpace[singleSeries.inDataSpace.length - 1][1];\n }\n\n const newDataInDataSpace = simpleSeriesToDataSpace(singleSeries, {\n data: simpleData.slice(singleSeries.simpleDataSliceStart || 0),\n valueXStart: singleSeries.inDataSpace.length,\n prevY,\n stateController: this\n });\n newData.set(singleSeries, newDataInDataSpace);\n singleSeries.simpleDataSliceStart = simpleData.length;\n\n if (newDataInDataSpace.length < 32) {\n singleSeries.inDataSpace.push(...newDataInDataSpace);\n } else {\n for (let point of newDataInDataSpace) {\n singleSeries.inDataSpace.push(point);\n }\n }\n\n let newDataBounds = calculateDataBounds(newDataInDataSpace);\n if (singleSeries.rendering === 'bar') {\n newDataBounds = expandBounds(newDataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });\n }\n\n singleSeries.dataBounds = mergeBounds([singleSeries.dataBounds, newDataBounds]);\n this._dataBounds = mergeBounds([this._dataBounds, newDataBounds]);\n\n // save these off for debugging only\n singleSeries.newPointCount = newDataInDataSpace.length;\n singleSeries.newDataBounds = newDataBounds;\n }\n\n const previousSelection = this._selection;\n this._recalculateSelection();\n\n for (let singleSeries of modifiedSeries) {\n if (!singleSeries.inSelectedSpace.data.length) { // empty, trivially fast\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data);\n continue;\n }\n\n const firstX = singleSeries.inSelectedSpace.data[0][0];\n const lastX = singleSeries.inSelectedSpace.data[singleSeries.inSelectedSpace.data.length - 1][0];\n\n const oldBoundSubsetOfNewBounds = previousSelection.minX >= firstX && previousSelection.maxX <= lastX;\n\n if (!oldBoundSubsetOfNewBounds || this._percentile !== 100) {\n // this is significantly slower, but it's too complex to diff the old bounds and new bounds or diff percentiles\n // besides, it not being a subset hopefully means its a lower volume of data\n singleSeries.selectedBounds = calculateDataBounds(singleSeries.inSelectedSpace.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry});\n if (singleSeries.hasAreaBottom) {\n singleSeries.selectedBoundsAreaTop = singleSeries.selectedBounds;\n singleSeries.selectedBoundsAreaBottom = calculateDataBounds(singleSeries.inSelectedSpaceAreaBottom.data, { percentile: this._percentile, percentileAsymmetry: this._percentileAsymmetry });\n\n singleSeries.selectedBounds = mergeBounds([\n singleSeries.selectedBoundsAreaTop,\n singleSeries.selectedBoundsAreaBottom\n ]);\n }\n continue;\n }\n\n // note: we could do a binary search here, but there are typically only a few points added each frame, so it isn't worth it\n const newSelectedData = newData.get(singleSeries)\n .filter((tuple) => tuple[0] >= this._selection.minX && tuple[0] <= this._selection.maxX);\n\n singleSeries.newSelectedData = newSelectedData;\n singleSeries.selectedBounds = mergeBounds([singleSeries.selectedBounds, calculateDataBounds(newSelectedData)]);\n }\n\n this._recalculateAxisBounds();\n\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n\n for (let axis of modifiedAxes) {\n for (let singleSeries of axis.series) {\n this._calculatePrimarySizeDependents(singleSeries);\n this._calculateRangeGraphSizeDependents(singleSeries);\n }\n }\n }\n\n _recalculateAxisBounds() {\n for (let axis of this._axes) {\n if (this._selection.fixedY || !this._autoscaleY) {\n axis.targetBounds = this._selection;\n if (axis.targetBounds.byAxis) {\n axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];\n }\n\n axis.currentBounds = axis.targetBounds;\n continue;\n }\n\n const selectedBoundsList = [];\n const expandYWith = [];\n\n for (let singleSeries of axis.series) {\n selectedBoundsList.push(singleSeries.selectedBounds);\n\n if (singleSeries.expandYWith) {\n expandYWith.push(...singleSeries.expandYWith);\n }\n\n if (singleSeries.rendering === 'bar') {\n expandYWith.push(singleSeries.selectedBounds.minY, singleSeries.selectedBounds.maxY);\n }\n }\n\n axis.selectedDataBounds = mergeBounds(selectedBoundsList);\n axis.targetBounds = axis.currentBounds = expandBounds(axis.selectedDataBounds, {expandYWith});\n }\n this.deferredPriorityEmit('axis_bounds_changed', this._axes.map(({ currentBounds }) => currentBounds));\n }\n\n /**\n * Recalculates global bounds, selection, and data in selected space (for each series)\n * REQUIRES that this._dataBounds and this._expandYWith are set & up-to-date\n *\n * @private\n */\n _recalculateSelection({disableSwap = false}={}) {\n this._globalBounds = expandBounds(this._dataBounds, {expandYWith: this._expandYWith.flat()});\n this.deferredPriorityEmit('global_bounds_changed', this._globalBounds);\n this._selection = selectionFromGlobalBounds(this._globalBounds, this._boundsCalculator);\n this.deferredPriorityEmit('selection_changed', this._selection);\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n singleSeries.inSelectedSpace = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: disableSwap ? null : singleSeries.inSelectedSpace,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceAreaBottom = dataSpaceToSelectedSpace({\n data:singleSeries.inDataSpace.filter((_, i) => i % 2 === 0),\n swap: disableSwap ? null : singleSeries.inSelectedSpaceAreaBottom,\n minX: this._selection.minX,\n maxX: this._selection.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n });\n }\n }\n }\n\n _render() {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n this.primaryRenderer.clear();\n if (this.rangeGraphRenderer) {\n this.rangeGraphRenderer.clear();\n }\n\n for (let singleSeries of this._series) {\n if (singleSeries.hidden) {\n continue;\n }\n\n const shadowColor = singleSeries.shadowColor || {\n day: 'white',\n export: 'transparent',\n night: 'black'\n }[this._theme] || 'black';\n\n const shadowBlur = undefined;\n\n this.primaryRenderer.renderBackground(singleSeries.inBackgroundSpacePrimary);\n\n this.primaryRenderer.render(singleSeries, singleSeries.inRenderSpacePrimary, {\n highlighted: this._highlightedSeries === singleSeries.index,\n showIndividualPoints: this._showIndividualPoints,\n shadowColor,\n shadowBlur,\n defaultLineWidth: this._defaultLineWidth,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpacePrimaryAreaBottom\n });\n\n if (this.rangeGraphRenderer && this.rangeGraphRenderer.sizing) {\n this.rangeGraphRenderer.render(singleSeries, singleSeries.inRenderSpaceRangeGraph, {\n shadowColor: 'transparent',\n shadowBlur: 0,\n width: 1,\n bounds: this._globalBounds,\n globalBounds: this._globalBounds,\n inRenderSpaceAreaBottom: singleSeries.inRenderSpaceRangeGraphAreaBottom\n });\n }\n }\n }\n\n _calculatePrimarySizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.primaryRenderer || !this.primaryRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculatePrimarySizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { currentBounds, scale } = singleSeries.axis;\n const renderWidth = Math.ceil(this.primaryRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.primaryRenderer.sizing.renderHeight);\n\n const toCondensedSelectedSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpacePrimary = condenseDataSpace({\n data: singleSeries.inSelectedSpace.data,\n swap: singleSeries.inCondensedSelectedSpacePrimary,\n ...toCondensedSelectedSpaceParams\n });\n\n const toRenderSpaceParams = {\n minX: currentBounds.minX,\n maxX: currentBounds.maxX,\n minY: currentBounds.minY,\n maxY: currentBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpacePrimary = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n swap: singleSeries.inRenderSpacePrimary,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimary = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimary.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimary,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inCondensedSelectedSpacePrimaryAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpacePrimaryAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n swap: singleSeries.inRenderSpacePrimaryAreaBottom,\n ...toRenderSpaceParams\n });\n\n singleSeries.inBackgroundSpacePrimaryAreaBottom = selectedSpaceToBackgroundSpace({\n data: singleSeries.inCondensedSelectedSpacePrimaryAreaBottom.data,\n background: singleSeries.background,\n swap: singleSeries.inBackgroundSpacePrimaryAreaBottom,\n minX: currentBounds.minX,\n maxX: currentBounds.maxX\n });\n }\n }\n\n _calculateRangeGraphSizeDependents(singleSeries, { dataChanged=false } = {}) {\n if (!this.rangeGraphRenderer || !this.rangeGraphRenderer.sizing) {\n return;\n }\n\n if (!singleSeries) {\n for (let s of this._series) {\n this._calculateRangeGraphSizeDependents(s);\n }\n return;\n }\n\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n if (singleSeries.hidden) {\n return;\n }\n\n const { scale } = singleSeries.axis;\n const globalBounds = this._globalBounds;\n const renderWidth = Math.ceil(this.rangeGraphRenderer.sizing.renderWidth/DPI_INCREASE);\n const renderHeight = Math.ceil(this.rangeGraphRenderer.sizing.renderHeight);\n\n const toSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n ignoreDiscontinuities: singleSeries.ignoreDiscontinuities,\n square: singleSeries.square\n };\n\n singleSeries.inSelectedSpaceRangeGraph = dataSpaceToSelectedSpace({\n data: singleSeries.hasAreaBottom ? singleSeries.inDataSpace.filter((_, i) => i % 2 === 1) : singleSeries.inDataSpace,\n swap: singleSeries.inSelectedSpaceRangeGraph,\n ...toSelectedSpaceParams\n });\n\n const toCondensedSelectedSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n renderWidth,\n dataChanged\n };\n\n singleSeries.inCondensedSelectedSpaceRangeGraph = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraph.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraph\n });\n\n const toRenderSpaceParams = {\n minX: globalBounds.minX,\n maxX: globalBounds.maxX,\n minY: globalBounds.minY,\n maxY: globalBounds.maxY,\n renderWidth,\n renderHeight,\n scale,\n dataChanged\n };\n\n singleSeries.inRenderSpaceRangeGraph = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraph.data,\n swap: singleSeries.inRenderSpaceRangeGraph,\n ...toRenderSpaceParams\n });\n\n if (singleSeries.hasAreaBottom) {\n singleSeries.inSelectedSpaceRangeGraphAreaBottom = dataSpaceToSelectedSpace({\n data: singleSeries.inDataSpace.filter((_, i) => i % 2 === 0), // take the odd points for area bottom\n swap: singleSeries.inSelectedSpaceRangeGraphAreaBottom,\n ...toSelectedSpaceParams\n });\n\n singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom = condenseDataSpace({\n data: singleSeries.inSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom,\n ...toCondensedSelectedSpaceParams\n });\n\n singleSeries.inRenderSpaceRangeGraphAreaBottom = selectedSpaceToRenderSpace({\n data: singleSeries.inCondensedSelectedSpaceRangeGraphAreaBottom.data,\n swap: singleSeries.inRenderSpaceRangeGraphAreaBottom,\n ...toRenderSpaceParams\n });\n }\n }\n\n _createAxis({ side }) {\n const axis = {\n series: [],\n scale: 'linear',\n side,\n axisIndex: this._axes.length\n };\n this._axes.push(axis);\n return axis;\n }\n\n _moveAxis(singleSeries, axisIndex) {\n if (!this._series.includes(singleSeries)) {\n throw new Error('Series no longer exists');\n }\n\n let newAxis;\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n newAxis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n newAxis = this._axes[parseInt(axisIndex)];\n }\n\n if (singleSeries.axis === newAxis) {\n return;\n }\n\n const oldAxis = singleSeries.axis;\n const oldIndex = oldAxis.series.indexOf(singleSeries);\n if (oldIndex === -1) {\n throw new Error('Series not present in axis');\n }\n oldAxis.series.splice(oldIndex, 1);\n\n newAxis.series.push(singleSeries);\n singleSeries.axis = newAxis;\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('left_axes_changed', this.leftAxes);\n this.deferredEmit('right_axes_changed', this.rightAxes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n this._markDirty();\n }\n\n _assignAxisTo(singleSeries) {\n if (singleSeries.axis && typeof singleSeries.axis === 'object') {\n return;\n }\n\n let axis;\n\n if (singleSeries.axisIndex) {\n const { axisIndex } = singleSeries;\n\n if (axisIndex === 'new-left' || axisIndex === 'new-right') {\n axis = this._createAxis({ side: axisIndex.split('-')[1] });\n } else {\n axis = this._axes[parseInt(axisIndex)];\n }\n } else if (singleSeries.axis) {\n singleSeries.originalAxis = singleSeries.axis;\n let [side, number] = singleSeries.axis.split('-');\n axis = findMatchingAxis({ axes: this._axes, side, number });\n\n if (!axis) {\n axis = this._createAxis({\n side\n });\n }\n } else {\n axis = this._axes[0];\n }\n\n axis.series.push(singleSeries);\n singleSeries.axis = axis;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (singleSeries.axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _removeSeries(singleSeries) {\n this._seriesFromOriginalSeries.delete(singleSeries.originalSeries);\n\n const { axis, data } = singleSeries;\n axis.series.splice(axis.series.indexOf(singleSeries), 1);\n const sameDataSet = this._observablesToSeries.get(data);\n if (sameDataSet) {\n sameDataSet.delete(singleSeries);\n if (sameDataSet.size === 0) {\n this._observablesToSeries.delete(data);\n }\n }\n\n if (this._generatorsToSeries.has(data)) {\n this._generatorsToSeries.get(data).delete(singleSeries);\n if (this._generatorsToSeries.get(data).size === 0) {\n this._generatorsToSeries.delete(data);\n this._generators.delete(data);\n }\n }\n\n this._alwaysTooltipped.delete(singleSeries);\n\n singleSeries.axis = singleSeries.originalAxis;\n delete singleSeries.originalAxis;\n delete singleSeries.inDataSpace;\n delete singleSeries.inSelectedSpace;\n delete singleSeries.inValueSpacePrimary;\n delete singleSeries.inValueSpaceRangeGraph;\n delete singleSeries.inRenderSpacePrimary;\n delete singleSeries.inRenderSpaceRangeGraph;\n delete singleSeries.newPointCount;\n delete singleSeries.newDataBounds;\n delete singleSeries.simpleDataSliceStart;\n\n this.deferredEmit('axes_changed', this._axes);\n this.deferredEmit('exported_axes_changed', this.exportedAxes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _hideSeries(singleSeries) {\n const { axis } = singleSeries;\n const indexInAxis = axis.series.indexOf(singleSeries);\n singleSeries.indexInAxis = indexInAxis;\n axis.series.splice(indexInAxis, 1);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n _showSeries(singleSeries) {\n const { axis } = singleSeries;\n axis.series.splice(singleSeries.indexInAxis, 0, singleSeries);\n\n this.deferredEmit('axes_changed', this._axes);\n\n if (axis.side === 'left') {\n this.deferredEmit('left_axes_changed', this.leftAxes);\n } else {\n this.deferredEmit('right_axes_changed', this.rightAxes);\n }\n }\n\n /*\n * Getters\n *******************\n */\n\n get boundCalculator() {\n return this._boundsCalculator;\n }\n\n get axes() {\n return this._axes;\n }\n\n get leftAxes() {\n const leftAxes = this._axes.filter(({ side, series }) => side === 'left' && series.length > 0).reverse();\n\n if (leftAxes.length === 0 && this.rightAxes.length === 0) {\n leftAxes.push(this._axes[0]);\n }\n\n return leftAxes;\n }\n\n get rightAxes() {\n return this._axes.filter(({ side, series }) => side === 'right' && series.length > 0 );\n }\n\n get bounds() {\n return this._axes.map(({ targetBounds }) => targetBounds);\n }\n\n get selection() {\n return this._selection;\n }\n\n get globalBounds() {\n return this._globalBounds;\n }\n\n get series() {\n return this._series;\n }\n\n get highlightedSeries() {\n return this._highlightedSeries;\n }\n\n get showIndividualPoints() {\n return this._showIndividualPoints;\n }\n\n get autoscaleY() {\n return this._autoscaleY;\n }\n\n get boundHistory() {\n return {\n hasNextBounds: this._boundsIndex < this._boundsHistory.length - 1,\n hasPreviousBounds: this._boundsIndex > 0\n };\n }\n\n get tooltipState() {\n return this._tooltipState;\n }\n \n get contextMenuState() {\n return this._contextMenuPosition;\n }\n\n get alwaysTooltipped() {\n return this._alwaysTooltipped;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n get averageLoopTime() {\n return averageLoopTimes(this._timingBuffer);\n }\n\n get exportedAxes() {\n const axisToName = new Map();\n let leftCount = 0;\n let rightCount = 0;\n\n for (let axis of this._axes) {\n let name;\n if (axis.side === 'left') {\n name = `left-${leftCount}`;\n leftCount++;\n } else {\n name = `right-${rightCount}`;\n rightCount++;\n }\n\n for (let singleSeries of axis.series) {\n axisToName.set(singleSeries, name);\n }\n }\n\n return this.series.map((singleSeries) => {\n return {\n ...singleSeries.originalSeries,\n axis: axisToName.get(singleSeries)\n };\n });\n }\n\n get percentile() {\n return this._percentile;\n }\n\n get percentileAsymmetry() {\n return this._percentileAsymmetry;\n }\n\n get showingOptions() {\n return this._showingOptions;\n }\n\n get maxPrecision() {\n return this._maxPrecision;\n }\n\n get showingSidebar() {\n return this._showingSidebar;\n }\n\n get showingAnnotations() {\n return this._showingAnnotations;\n }\n\n get userCreatedSeries() {\n return this._series.filter((singleSeries) => singleSeries.userCreated);\n }\n\n get grapherID() {\n return this._grapherID;\n }\n\n get annotationState() {\n return this._annotationsState;\n }\n\n get sizing() {\n return this.primaryRenderer && this.primaryRenderer.sizing;\n }\n\n get theme() {\n return this._theme;\n }\n\n get exportMode() {\n return this._exportMode;\n }\n\n get enumMap() {\n return this._enumMap;\n }\n\n get hasXEnum() {\n return this._hasXEnum;\n }\n\n /*\n * Setters / ways to mutate the state that aren't the underlying data changing\n ***********************************************************************************\n */\n\n markSizeChanged(renderer) {\n if (renderer === this.primaryRenderer) {\n this.deferredEmit('primary_size_change', this.primaryRenderer.sizing);\n this.deferredEmit('primary_bounding_rect_change', this.primaryRenderer.boundingRect);\n this._primarySizeChanged = true;\n } else if (renderer === this.rangeGraphRenderer) {\n this.deferredEmit('range_graph_size_change', this.rangeGraphRenderer.sizing);\n this.deferredEmit('range_graph_bounding_rect_change', this.rangeGraphRenderer.boundingRect);\n this._rangeGraphSizeChanged = true;\n }\n\n this._mustRerender = true;\n this._tooltipsChanged = true;\n this._annotationsChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set theme(value) {\n this._theme = value;\n this._mustRerender = true;\n this.deferredEmit('theme_change', this._theme);\n this._markDirty();\n }\n\n set exportMode(value) {\n this._exportMode = value;\n\n if (value) {\n this._nonExportTheme = this.theme;\n this.theme = 'export';\n } else {\n this.theme = this._nonExportTheme;\n }\n\n this.deferredEmit('export_mode_change', this._exportMode);\n this._markDirty();\n }\n\n set defaultLineWidth(value) {\n this._defaultLineWidth = value;\n this._mustRerender = true;\n this._markDirty();\n }\n\n set boundCalculator(boundingFunction) {\n if (!boundingFunction) {\n return;\n }\n\n if (boundingFunction === this._boundsCalculator) {\n return;\n }\n\n if (boundingFunction.debounceHistory) {\n clearTimeout(this._boundingCalculatorDebouncer);\n this._boundingCalculatorDebouncer = setTimeout(() => {\n this._addBoundCalculatorToHistory(boundingFunction);\n }, 250);\n } else {\n this._addBoundCalculatorToHistory(boundingFunction);\n }\n\n this._boundsCalculator = boundingFunction;\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this._dataChanged = true;\n this._mustCallGenerators = true;\n this._markDirty();\n }\n\n set customBoundsSelectors(boundsSelectors) {\n this._customBoundsSelectors = this._customBoundsSelectors || {};\n\n const indexedCustomBoundSelectors = {};\n\n for (let { label, calculator } of boundsSelectors) {\n indexedCustomBoundSelectors[label] = calculator;\n\n if (this._boundsCalculator === this._customBoundsSelectors[label] && this._boundsCalculator !== calculator) {\n this.boundCalculator = calculator;\n }\n }\n\n this._customBoundsSelectors = indexedCustomBoundSelectors;\n }\n\n _addBoundCalculatorToHistory(boundingFunction) {\n this._boundsIndex++;\n this._boundsHistory = this._boundsHistory.slice(0, this._boundsIndex);\n this._boundsHistory.push(boundingFunction);\n this.emit('bound_history_changed', this.boundHistory);\n }\n\n registerSeriesClick(selectedSeriesIndex) {\n this.emit('series_click', this._series[selectedSeriesIndex], selectedSeriesIndex);\n }\n\n setHighlightedSeries(highlightedSeries) {\n this._highlightedSeries = highlightedSeries;\n this.deferredEmit('highlighted_series_changed', highlightedSeries);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleIndividualPoints() {\n this._showIndividualPoints = !this._showIndividualPoints;\n this.deferredEmit('show_individual_points_changed', this._showIndividualPoints);\n this._mustRerender = true;\n this._markDirty();\n }\n\n toggleYAutoscaling() {\n this._autoscaleY = !this._autoscaleY;\n this.deferredEmit('autoscale_y_changed', this._autoscaleY);\n this._markDirty();\n }\n\n toggleExportMode() {\n this.exportMode = !this._exportMode;\n }\n\n setBoundsFromSelection(pixelSelection) {\n this.boundCalculator = boundCalculatorFromSelection(pixelSelection, {\n elementWidth: this.primaryRenderer.sizing.elementWidth,\n elementHeight: this.primaryRenderer.sizing.elementHeight,\n selection: this._selection,\n axes: this._axes\n });\n }\n\n nextBounds() {\n this._boundsIndex++;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n previousBounds() {\n this._boundsIndex--;\n this._boundsCalculator = this._boundsHistory[this._boundsIndex];\n this.deferredEmit('bound_calculator_changed', this._boundsCalculator);\n this.deferredEmit('bound_history_changed', this.boundHistory);\n this._dataChanged = true;\n this._markDirty();\n }\n\n setLabel({ axisIndex, label }) {\n this._axes[axisIndex].label = label;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n toggleScale({ axisIndex }) {\n const oldScale = this._axes[axisIndex].scale;\n this._axes[axisIndex].scale = oldScale === 'log' ? 'linear' : 'log';\n\n this._dataChanged = true;\n this.deferredEmit('axes_changed', [...this._axes]);\n this._markDirty();\n }\n\n recalculateTooltips() {\n this.primaryRenderer.recalculatePosition();\n this.setTooltipMousePosition({\n clientX: this._tooltipClientX,\n clientY: this._tooltipClientY,\n shiftKey: this.shiftKeyPressedOnMove,\n tooltipAllNext: this._tooltipAllNext,\n tooltipStateArg: this._tooltipStateArg\n });\n }\n\n setTooltipMousePosition({ clientX, clientY, shiftKey, mouseX, mouseY, tooltipAllNext, tooltipStateArg }) {\n const sizing = this.primaryRenderer.sizing;\n if (!sizing) {\n return;\n }\n\n if (typeof clientX === 'number') {\n this._tooltipClientX = clientX;\n\n if (clientX < sizing.boundingRect.left || clientX > sizing.boundingRect.right) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n if (typeof clientY === 'number') {\n this._tooltipClientY = clientY;\n\n if (clientY < sizing.boundingRect.top || clientY > sizing.boundingRect.bottom) {\n this.showOnlySavedTooltips();\n return;\n }\n } else if (typeof mouseY !== 'number') {\n return;\n }\n\n const newMouseX = mouseX || (clientX - sizing.boundingRect.left);\n const newMouseY = mouseY || (clientY - sizing.boundingRect.top);\n if (this._tooltipState.mousePresent && newMouseX === this._tooltipState.mouseX && newMouseY === this._tooltipState.mouseY) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = true;\n this._tooltipState.mouseX = newMouseX;\n this._tooltipState.mouseY = newMouseY;\n this.shiftKeyPressedOnMove = shiftKey;\n this._tooltipAllNext = tooltipAllNext;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n \n setContextMenuMousePosition({ clientX, clientY }) {\n this._contextMenuPosition = { x: clientX, y: clientY, showing: !this._contextMenuPosition.showing };\n this._contextMenuChanged = true;\n this._markDirty();\n }\n\n toggleAlwaysTooltipped(singleSeries, shiftKey) {\n if (this._alwaysTooltipped.has(singleSeries)) {\n if (shiftKey) {\n this._alwaysTooltipped.clear();\n } else {\n this._alwaysTooltipped.delete(singleSeries);\n }\n } else {\n if (shiftKey) {\n for (let series of this._series) {\n this._alwaysTooltipped.add(series);\n }\n } else {\n this._alwaysTooltipped.add(singleSeries);\n }\n }\n\n this._tooltipsChanged = true;\n this.deferredEmit('always_tooltipped_changed', this._alwaysTooltipped);\n this._markDirty();\n }\n\n showOnlySavedTooltips(tooltipStateArg) {\n if (!this._tooltipState.mousePresent) {\n return;\n }\n\n this._tooltipsChanged = true;\n this._tooltipState.mousePresent = false;\n this._tooltipStateArg = tooltipStateArg;\n this._markDirty();\n }\n\n registerClick({ clientX }) {\n if (!this._listeners['series_click']) {\n return;\n }\n\n const boundingRect = this.primaryRenderer.boundingRect;\n const sizing = this.primaryRenderer.sizing;\n\n for (let series of this._series) {\n const bounds = series.axis.currentBounds;\n\n const x = (clientX - boundingRect.left) / sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n this.emit('series_click', { x, series });\n }\n }\n\n toggleTooltipSaved() {\n const oldSavedTooltips = this._savedTooltips;\n this._savedTooltips = toggleTooltipSaved({\n currentTooltips: this._tooltipState.tooltips,\n savedTooltips: this._savedTooltips\n });\n this._tooltipsChanged = this._savedTooltips !== oldSavedTooltips;\n this._markDirty();\n }\n\n clearSavedTooltips() {\n if (this._savedTooltips.length === 0) {\n return;\n }\n\n this._savedTooltips = [];\n this._tooltipsChanged = true;\n this._markDirty();\n }\n\n markDragStart() {\n if (this._draggingY) {\n return;\n }\n\n this._draggingY = true;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n this._markDirty();\n }\n\n finalizeDrag(draggedSeries, axisIndex, grapherID) {\n if (!this._draggingY) {\n return;\n }\n\n this._draggingY = false;\n this.deferredEmit('dragging_y_changed', this._draggingY);\n\n const hasAxis = axisIndex && axisIndex !== 0;\n const sameGrapherID = grapherID === this._grapherID;\n\n if (hasAxis && sameGrapherID) {\n this._moveAxis(draggedSeries, axisIndex);\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n } else if (grapherID) {\n this.deferredEmit('dragging_y_finalized', { draggedSeries, axisIndex, grapherID });\n }\n\n this._markDirty();\n }\n\n set timingFrameCount(value) {\n if (typeof value !== 'number') {\n return;\n }\n\n this._timingBuffer = [];\n this._timingIndex = 0;\n this._timingFrameCount = value;\n }\n\n set percentile(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_changed', value);\n\n if (value === '') {\n value = 100;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 100 && value >= 0) {\n this._percentile = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set percentileAsymmetry(value) {\n if (value === undefined) {\n return;\n }\n\n this.deferredEmit('percentile_asymmetry_changed', value);\n\n if (value === '') {\n value = 0;\n }\n\n value = parseFloat(value);\n if (!isNaN(value) && value <= 50 && value >= -50) {\n this._percentileAsymmetry = value;\n this._dataChanged = true;\n }\n\n this._markDirty();\n }\n\n set showingOptions(value) {\n if (value === undefined) {\n return;\n }\n\n this._showingOptions = value;\n this.deferredEmit('showing_options_changed', value);\n this._markDirty();\n }\n\n toggleShowingOptions() {\n this.showingOptions = !this.showingOptions;\n }\n\n toggleMaxPrecision() {\n this._maxPrecision = !this._maxPrecision;\n this.deferredEmit('max_precision_changed', this._maxPrecision);\n this._markDirty();\n }\n\n toggleShowingAnnotations() {\n this._showingAnnotations = !this._showingAnnotations;\n this.deferredEmit('showing_annotations_changed', this._showingAnnotations);\n this._markDirty();\n }\n\n toggleShowingSidebar() {\n this._showingSidebar = !this._showingSidebar;\n this.deferredEmit('showing_sidebar_changed', this._showingSidebar);\n this._markDirty();\n }\n\n setShowing(singleSeries, showing) {\n singleSeries.hidden = !showing;\n this._series = [...this._series];\n\n if (singleSeries.hidden) {\n this._hideSeries(singleSeries);\n } else {\n this._showSeries(singleSeries);\n }\n\n this.deferredEmit('series_changed', this._series, { skipResize: true });\n this._dataChanged = true;\n this._markDirty();\n }\n\n set annotations(value) {\n this._annotations = value || [];\n this._annotationsChanged = true;\n this._markDirty();\n }\n\n /**\n * Converts an enum to a number, mutating saved state if necessary to track that\n *\n * @param {String} value\n * @param {Object} singleSeries\n * @param {Boolean} [isX]\n * @return {Number}\n */\n enumToNumber(value, singleSeries, isX) {\n const existingIndex = this._enumMap[value];\n if (typeof existingIndex === 'number') {\n return existingIndex;\n }\n\n const indexToSet = Object.keys(this._enumMap).length;\n this._enumMap[value] = indexToSet;\n\n // safely handle reference changes\n this._series[singleSeries.index].hasEnum = true;\n if (isX) {\n this._series[singleSeries.index].hasXEnum = true;\n this._hasXEnum = true;\n this.deferredEmit('has_x_enum_change', this._hasXEnum);\n this.deferredEmit('x_enum_map_change', this._enumMap);\n }\n\n this.deferredEmit('enum_map_change', this._enumMap);\n\n return indexToSet;\n }\n\n triggerResize() {\n this._mustResize = true;\n this._markDirty();\n }\n}\n","import BOUND_CALCULATORS from './bound_calculators';\n\nexport default function getDefaultBoundsCalculator(givenLabel, customCalculators) {\n if (BOUND_CALCULATORS[givenLabel]) {\n return BOUND_CALCULATORS[givenLabel];\n }\n\n for (let { label, calculator } of customCalculators) {\n if (givenLabel === label) {\n return calculator;\n }\n }\n\n return BOUND_CALCULATORS.all;\n}\n","export default function generatorParamsEqual(a, b) {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n\n return (a.minX === b.minX) &&\n (a.maxX === b.maxX) &&\n (a.sizing.elementWidth === b.sizing.elementWidth) &&\n (a.sizing.renderWidth === b.sizing.renderWidth);\n}\n","import nameForSeries from '../helpers/name_for_series.js';\n\nexport default function calculateAnnotationsState({ annotations, series, sizing, selection }) {\n const shownSeries = new Set(series.map((singleSeries, i) => {\n return {\n name: nameForSeries(singleSeries, i),\n hidden: singleSeries.hidden\n };\n }).filter(({ hidden }) => !hidden).map(({ name }) => name));\n\n const { elementWidth } = sizing;\n const { minX, maxX } = selection;\n const xRange = maxX - minX;\n\n // Avoid division by zero if minX === maxX\n if (xRange === 0) {\n return {\n annotations: [],\n elementWidth\n };\n }\n\n const renderableAnnotations = annotations.filter((annotation) => {\n if (!annotation.series) {\n return true;\n }\n\n for (let seriesName of annotation.series) {\n if (shownSeries.has(seriesName)) {\n return true;\n }\n }\n\n return false;\n }).map((annotation) => {\n const isRange = annotation.startX !== undefined && annotation.endX !== undefined;\n const isPoint = annotation.x !== undefined;\n\n let xStartValue = annotation.startX;\n let xEndValue = annotation.endX;\n\n if (!isRange && isPoint) {\n xStartValue = annotation.x;\n xEndValue = annotation.x;\n } else if (!isRange && !isPoint) {\n return null;\n }\n\n const convertToNumber = (val) => {\n if (typeof val === 'string') return new Date(val).valueOf();\n if (val instanceof Date) return val.valueOf();\n return val;\n };\n\n let startX = convertToNumber(xStartValue);\n let endX = convertToNumber(xEndValue);\n\n if (startX > endX) {\n [startX, endX] = [endX, startX];\n }\n\n let pixelStartX = (startX - minX) / xRange * elementWidth;\n let pixelEndX = (endX - minX) / xRange * elementWidth;\n\n // Clamp values to be within the element width\n pixelStartX = Math.max(0, Math.min(elementWidth, pixelStartX));\n pixelEndX = Math.max(0, Math.min(elementWidth, pixelEndX));\n\n let pixelWidth = pixelEndX - pixelStartX;\n if (pixelWidth < 1 && pixelEndX > 0 && pixelStartX < elementWidth) {\n if (!isRange && isPoint) {\n pixelWidth = 1;\n pixelStartX -= 0.5;\n } else if (isRange) {\n pixelWidth = 1;\n } else {\n pixelWidth = 0;\n }\n }\n \n pixelStartX = Math.max(0, Math.min(elementWidth - pixelWidth, pixelStartX));\n\n\n if (pixelWidth <= 0) {\n return null;\n }\n\n\n return {\n ...annotation,\n isRange,\n pixelStartX,\n pixelWidth\n };\n }).filter(annotation => annotation !== null);\n\n return {\n annotations: renderableAnnotations,\n elementWidth\n };\n}\n","export default function selectionFromGlobalBounds(globalBounds, boundsCalculator) {\n const targetBounds = Object.assign({}, globalBounds, boundsCalculator(globalBounds));\n\n if (targetBounds.maxX instanceof Date) {\n targetBounds.maxX = targetBounds.maxX.valueOf();\n }\n\n if (targetBounds.minX instanceof Date) {\n targetBounds.minX = targetBounds.minX.valueOf();\n }\n\n if (targetBounds.maxX < targetBounds.minX) {\n targetBounds.maxX = targetBounds.minX;\n }\n\n if (targetBounds.minX < globalBounds.minX) {\n targetBounds.minX = globalBounds.minX;\n }\n\n if (targetBounds.maxX > globalBounds.maxX) {\n targetBounds.maxX = globalBounds.maxX;\n }\n\n return targetBounds;\n}\n","/**\n *\n * @param {Array<Object>} axes\n * @param {'left'|'right'} [side]\n * @param {String|Number} [number]\n * @return {Object|undefined}\n */\nexport default function findMatchingAxis({ axes, side, number }) {\n if (number) {\n number = parseInt(number) || 0;\n } else {\n number = 0;\n }\n\n let axis;\n let seen = 0;\n for (let candidateAxis of axes) {\n if (candidateAxis.side !== side) {\n continue;\n }\n\n if (seen === number) {\n axis = candidateAxis;\n break;\n }\n\n seen++;\n }\n\n return axis;\n}\n","export function averageLoopTimes(loopTimes) {\n const result = {};\n\n for (let loopTime of loopTimes) {\n for (let [key, value] of Object.entries(loopTime)) {\n result[key] = (result[key] || 0) + value;\n }\n }\n\n for (let [key, value] of Object.entries(result)) {\n result[key] = value/loopTimes.length;\n }\n\n return result;\n}\n","import scaleBounds from '../renderer/scale_bounds';\n\nexport default function boundCalculatorFromSelection({ minPixelX, maxPixelX, minPixelY, maxPixelY}, { elementWidth, elementHeight, selection, axes }) {\n if (Math.abs(maxPixelX - minPixelX) < 1 || Math.abs(maxPixelY - minPixelY) < 1) {\n return;\n }\n\n const minX = (minPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n const maxX = (maxPixelX/elementWidth)*(selection.maxX - selection.minX) + selection.minX;\n\n const byAxis = [];\n for (let { currentBounds, scale } of axes) {\n const scaledBounds = scaleBounds({ ...currentBounds, scale });\n let maxY = (1 - minPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n let minY = (1 - maxPixelY/elementHeight)*(scaledBounds.maxY - scaledBounds.minY) + scaledBounds.minY;\n\n if (scale === 'log') {\n minY = Math.pow(10, minY);\n maxY = Math.pow(10, maxY);\n }\n byAxis.push({\n minX,\n maxX,\n minY,\n maxY\n });\n }\n\n return () => {\n return {\n minX,\n maxX,\n byAxis\n };\n };\n}\n","import { useState, useEffect } from 'react';\n\nexport function useEvent(eventSource, eventName, initialState=null, watch=[]) {\n if (typeof initialState === 'function') {\n const originalInitialState = initialState;\n initialState = () => originalInitialState;\n }\n\n const [value, setValue] = useState(initialState);\n\n useEffect(() => {\n const listener = (updatedValue) => {\n if (typeof updatedValue === 'function') {\n const originalUpdatedValue = updatedValue;\n updatedValue = () => originalUpdatedValue;\n }\n setValue(updatedValue);\n };\n\n eventSource.on(eventName, listener);\n return () => {\n eventSource.off(eventName, listener);\n };\n }, [...watch, setValue, eventSource]);\n\n return value;\n}\n\nexport function usePrimarySize(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.primaryRenderer ? stateController.primaryRenderer.sizing : {\n elementWidth: 0,\n elementHeight: 0,\n renderWidth: 0,\n renderHeight: 0\n });\n}\n\nexport function useAxes(stateController) {\n return useEvent(stateController, 'axes_changed', stateController.axes);\n}\n\nexport function useSeries(stateController) {\n return useEvent(stateController, 'series_changed', stateController.series);\n}\n\nexport function useHighlightedSeries(stateController) {\n return useEvent(stateController, 'highlighted_series_changed', stateController.highlightedSeries);\n}\n\nexport function useRightAxisCount(stateController) {\n return useRightAxes(stateController).length;\n}\n\nexport function useLeftAxisCount(stateController) {\n return useLeftAxes(stateController).length;\n}\n\nexport function useRightAxes(stateController) {\n return useEvent(stateController, 'right_axes_changed', stateController.rightAxes);\n}\n\nexport function useLeftAxes(stateController) {\n return useEvent(stateController, 'left_axes_changed', stateController.leftAxes);\n}\n\nexport function useSelection(stateController) {\n return useEvent(stateController, 'selection_changed', stateController.selection);\n}\n\nexport function useGlobalBounds(stateController) {\n return useEvent(stateController, 'global_bounds_changed', stateController.globalBounds);\n}\n\nexport function useAxisBounds(stateController) {\n return useEvent(stateController, 'axis_bounds_changed', stateController.axes.map(({ currentBounds }) => currentBounds));\n}\n\nexport function useBoundCalculator(stateController) {\n return useEvent(stateController, 'bound_calculator_changed', stateController.boundCalculator);\n}\n\nexport function useShowIndividualPoints(stateController) {\n return useEvent(stateController, 'show_individual_points_changed', stateController.showIndividualPoints);\n}\n\nexport function useAutoscaleY(stateController) {\n return useEvent(stateController, 'autoscale_y_changed', stateController.autoscaleY);\n}\n\nexport function useBoundHistory(stateController) {\n return useEvent(stateController, 'bound_history_changed', stateController.boundHistory);\n}\n\nexport function useAlwaysTooltipped(stateController) {\n return useEvent(stateController, 'always_tooltipped_changed', stateController.alwaysTooltipped);\n}\n\nexport function useTooltipState(stateController) {\n return useEvent(stateController, 'tooltip_state_changed', stateController.tooltipState);\n}\n\nexport function useContextMenu(stateController) {\n return useEvent(stateController, 'context_menu_position_changed', stateController.contextMenuState);\n}\n\nexport function useDraggingY(stateController) {\n return useEvent(stateController, 'dragging_y_changed', stateController.draggingY);\n}\n\nexport function usePercentile(stateController) {\n return useEvent(stateController, 'percentile_changed', stateController.percentile);\n}\n\nexport function useShowingOptions(stateController) {\n return useEvent(stateController, 'showing_options_changed', stateController.showingOptions);\n}\n\nexport function useMaxPrecision(stateController) {\n return useEvent(stateController, 'max_precision_changed', stateController.maxPrecision);\n}\n\nexport function usePercentileAsymmetry(stateController) {\n return useEvent(stateController, 'percentile_asymmetry_changed', stateController.percentileAsymmetry);\n}\n\nexport function useShowingSidebar(stateController) {\n return useEvent(stateController, 'showing_sidebar_changed', stateController.showingSidebar);\n}\n\nexport function useShowingAnnotations(stateController) {\n return useEvent(stateController, 'showing_annotations_changed', stateController.showingAnnotations);\n}\n\nexport function useMultiSeries(multigraphStateController) {\n return useEvent(multigraphStateController, 'multi_series_changed', multigraphStateController.multiSeries);\n}\n\nexport function useAnnotationState(stateController) {\n return useEvent(stateController, 'annotations_changed', stateController.annotationState);\n}\n\nexport function useSizing(stateController) {\n return useEvent(stateController, 'primary_size_change', stateController.sizing);\n}\n\nexport function useTheme(stateController) {\n return useEvent(stateController, 'theme_change', stateController.theme);\n}\n\nexport function useExportMode(stateController) {\n return useEvent(stateController, 'export_mode_change', stateController.exportMode);\n}\n\nexport function useHasXEnum(stateController) {\n return useEvent(stateController, 'has_x_enum_change', stateController.hasXEnum);\n}\n\nexport function useEnumMap(stateController) {\n return useEvent(stateController, 'enum_map_change', stateController.enumMap);\n}\n\nexport function useXEnumMap(stateController) {\n return useEvent(stateController, 'x_enum_map_change', stateController.enumMap);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class Annotations extends React.PureComponent {\n\n render() {\n const { bodyHeight, annotationState } = this.props;\n const { annotations, elementWidth } = annotationState;\n\n const validAnnotations = annotations.filter(a => a.pixelStartX !== undefined && a.pixelWidth !== undefined);\n\n return (\n <div className=\"grapher-annotations\">\n {\n validAnnotations.map(({ pixelStartX, pixelWidth, content, isRange, lineOnly }, i) => {\n const annotationStyle = {\n left: pixelStartX\n };\n\n if (isRange) {\n return (\n <div key={`range-${i}`} className=\"grapher-annotation grapher-annotation-range\" style={annotationStyle}>\n <div\n className=\"annotation-range-marker\"\n style={{ width: pixelWidth, height: bodyHeight }}\n />\n </div>\n );\n } else {\n const pointMarkerWidth = lineOnly ? pixelWidth : Math.max(pixelWidth, 1);\n\n const textStyle = {};\n if (content) {\n textStyle.top = 21 * i;\n textStyle.position = 'absolute';\n const approxTextWidth = (content || '').length * 5.5;\n if (elementWidth > 0 && elementWidth - pixelStartX < approxTextWidth + 10) {\n textStyle.left = -approxTextWidth - 5;\n textStyle.textAlign = 'right';\n } else {\n textStyle.left = pointMarkerWidth + 5;\n }\n }\n\n return (\n <div key={`point-${i}`} className=\"grapher-annotation grapher-annotation-point\" style={annotationStyle}>\n <div\n className=\"annotation-marker\"\n style={{ width: pointMarkerWidth, height: bodyHeight }}\n />\n {content && !lineOnly &&\n <div className=\"annotation-text\" style={textStyle}>\n {content}\n </div>\n }\n </div>\n );\n }\n })\n }\n </div>\n );\n }\n}\n\nAnnotations.propTypes = {\n annotationState: PropTypes.shape({\n annotations: PropTypes.arrayOf(PropTypes.shape({\n pixelStartX: PropTypes.number,\n pixelWidth: PropTypes.number,\n content: PropTypes.string,\n isRange: PropTypes.bool,\n lineOnly: PropTypes.bool\n })).isRequired,\n elementWidth: PropTypes.number.isRequired\n }),\n bodyHeight: PropTypes.number\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {LINE_COLORS} from '../helpers/colors.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(DraggablePoints);\n\nfunction DraggablePoints({ stateController, draggablePoints, onPointDrag, onDraggablePointsDoubleClick }) {\n const bounds = useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const onPointlessDoubleClick = onDraggablePointsDoubleClick && ((event) => {\n const newXT = (event.clientX - sizing.boundingRect.left)/sizing.elementWidth;\n const newYT = 1 - (event.clientY - sizing.boundingRect.top)/sizing.elementHeight;\n\n onDraggablePointsDoubleClick(event, {\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n });\n });\n\n return (\n <div className=\"grapher-draggable-points\" onDoubleClick={onPointlessDoubleClick}>\n <svg width={sizing.elementWidth} height={sizing.elementHeight}>\n {\n draggablePoints.map((point, index) => {\n const xT = (point.x - bounds.minX)/(bounds.maxX - bounds.minX);\n const yT = (1 - (point.y - bounds.minY)/(bounds.maxY - bounds.minY));\n\n if (xT < 0 || xT > 1 || yT < 0 || yT > 1) {\n return null;\n }\n\n const pixelX = xT * sizing.elementWidth;\n const pixelY = yT * sizing.elementHeight;\n\n const radius = point.radius || 5;\n const fillColor = point.fillColor || LINE_COLORS[0];\n const strokeColor = point.strokeColor || 'white';\n const strokeWidth = point.strokeWidth || 1;\n\n const onMouseDown = (event) => {\n event.stopPropagation();\n\n if (!onPointDrag) {\n return;\n }\n\n const xOffset = pixelX - event.clientX;\n const yOffset = pixelY - event.clientY;\n\n const onMouseMove = (moveEvent) => {\n const newXT = (moveEvent.clientX + xOffset)/sizing.elementWidth;\n const newYT = 1 - (moveEvent.clientY + yOffset)/sizing.elementHeight;\n\n onPointDrag({\n index,\n point,\n x: newXT*(bounds.maxX - bounds.minX) + bounds.minX,\n y: newYT*(bounds.maxY - bounds.minY) + bounds.minY\n }, moveEvent);\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onClick = point.onClick && ((event) => {\n point.onClick(event, point);\n });\n\n const onDoubleClick = point.onDoubleClick && ((event) => {\n event.stopPropagation();\n point.onDoubleClick(event, point);\n });\n\n return (\n <circle\n key={index}\n cx={pixelX}\n cy={pixelY}\n r={radius}\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n />\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nDraggablePoints.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n draggablePoints: CustomPropTypes.DraggablePoints.isRequired,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func\n};\n","import React from 'react';\nimport CustomPropTypes from '../helpers/custom_prop_types.js';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller.js';\nimport {useAxisBounds, useSizing} from '../state/hooks.js';\n\nexport default React.memo(VerticalLines);\n\nfunction VerticalLines({ stateController, verticalLines, isRangeGraph, bounds, elementWidth, elementHeight }) {\n bounds = bounds || useAxisBounds(stateController)[0];\n const sizing = useSizing(stateController);\n\n if (!sizing) {\n return null;\n }\n\n const relevantVerticalLines = verticalLines.filter(line => {\n if (isRangeGraph && !line.onRangeGraph) {\n return false;\n }\n\n if (line.onRangeGraphOnly && !isRangeGraph) {\n return false;\n }\n\n return true;\n });\n\n if (relevantVerticalLines.length === 0) {\n return null;\n }\n\n return (\n <div className=\"grapher-vertical-lines\">\n <svg width={elementWidth || sizing.elementWidth} height={elementHeight || sizing.elementHeight}>\n {\n relevantVerticalLines.map((line, index) => {\n if (isRangeGraph && typeof line.onRangeGraph === 'object') {\n line = {\n ...line,\n ...line.onRangeGraph\n };\n }\n\n const xT = (line.x - bounds.minX)/(bounds.maxX - bounds.minX);\n\n if (xT < 0 || xT > 1) {\n return null;\n }\n\n const pixelX = xT * (elementWidth || sizing.elementWidth);\n if (typeof line.minPixelX === 'number' && pixelX < line.minPixelX) {\n return null;\n }\n\n if (typeof line.maxPixelX === 'number' && pixelX > line.maxPixelX) {\n return null;\n }\n\n const lineStyle = {\n stroke: line.color,\n strokeWidth: line.width,\n ...(line.style || {})\n };\n\n const markerStyle = {\n fill: line.color,\n ...(line.markerStyle || {})\n };\n\n const textStyle = {\n ...{\n fontSize: '12px',\n fill: line.color,\n stroke: 'none',\n textAnchor: 'middle',\n dominantBaseline: 'hanging'\n },\n ...(line.textStyle || {})\n };\n\n let lineTop = 0;\n if (typeof line.lineTop === 'number') {\n lineTop = line.lineTop;\n } else if (line.text) {\n lineTop = 18;\n }\n\n let textTop = 5;\n if (typeof line.textTop === 'number') {\n textTop = line.textTop;\n }\n\n return (\n <React.Fragment key={index}>\n <line\n x1={pixelX}\n y1={lineTop}\n x2={pixelX}\n y2={(elementHeight || sizing.elementHeight)}\n style={lineStyle}\n />\n\n {\n line.markTop &&\n <polygon\n points={`${pixelX - 3},0 ${pixelX + 3},0 ${pixelX},3`}\n style={markerStyle}\n />\n }\n\n {\n line.text &&\n <text\n x={pixelX}\n y={textTop}\n style={textStyle}\n >\n {line.text}\n </text>\n }\n </React.Fragment>\n );\n })\n }\n </svg>\n </div>\n );\n}\n\nVerticalLines.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n verticalLines: CustomPropTypes.VerticalLines.isRequired,\n isRangeGraph: PropTypes.bool,\n bounds: PropTypes.object,\n elementWidth: PropTypes.number,\n elementHeight: PropTypes.number\n};\n","import React, { useCallback, useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport Tooltip from './tooltip.jsx';\nimport ContextMenu from './context_menu.jsx';\nimport StateController from '../state/state_controller';\nimport {\n useAnnotationState,\n useAutoscaleY,\n useAxes,\n useMaxPrecision,\n useShowingAnnotations,\n useTooltipState,\n useContextMenu\n} from '../state/hooks';\nimport Annotations from './annotations.jsx';\nimport DraggablePoints from './draggable_points.jsx';\nimport VerticalLines from './vertical_lines.jsx';\nimport binarySearch from '../helpers/binary_search';\n\nexport default React.memo(GraphBody);\n\nfunction GraphBody({ stateController, webgl, bodyHeight, boundsSelectionEnabled, showTooltips, tooltipOptions, checkIntersection, draggablePoints, onPointDrag, onDraggablePointsDoubleClick, verticalLines, clockStyle, timeZone, onPointClick }) {\n const canvasEl = useCallback((el) => {\n if (stateController.primaryRenderer) {\n stateController.primaryRenderer.dispose();\n }\n\n if (!el) {\n return;\n }\n\n const renderer = new GraphBodyRenderer({\n stateController: stateController,\n canvasElement: el,\n webgl,\n checkIntersection\n });\n\n stateController.primaryRenderer = renderer;\n renderer.resize();\n }, [webgl, stateController]);\n\n\n const [boundsSelection, setBoundsSelection] = useState({\n showing: false,\n start: {},\n style: {}\n });\n\n const autoscaleY = useAutoscaleY(stateController);\n\n const axisCount = useAxes(stateController).length;\n\n const tooltip = useTooltipState(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showAnnotations = useShowingAnnotations(stateController);\n const annotationState = useAnnotationState(stateController);\n const contextMenu = useContextMenu(stateController);\n\n const onMouseDown = (event) => {\n if (!boundsSelectionEnabled) {\n return;\n }\n\n let currentNode = event.target;\n for (let i = 0; i < 10 && currentNode; i++) {\n if (currentNode.classList.contains('grapher-tooltip')) {\n return;\n }\n currentNode = currentNode.parentNode;\n }\n\n const boundingRect = stateController.primaryRenderer.boundingRect;\n\n const start = {\n x: event.clientX - boundingRect.left,\n y: event.clientY - boundingRect.top\n };\n\n\n setBoundsSelection({\n showing: true,\n start,\n style: {\n left: start.x,\n top: start.y,\n width: 0,\n height: 0\n }\n });\n\n const onMouseUp = (event) => {\n window.removeEventListener('mouseup', onMouseUp);\n\n if (!boundsSelectionEnabled) {\n return;\n }\n\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n stateController.setBoundsFromSelection({\n minPixelX: Math.min(x, start.x),\n maxPixelX: Math.max(x, start.x),\n minPixelY: Math.min(y, start.y),\n maxPixelY: Math.max(y, start.y)\n });\n\n setBoundsSelection({\n showing: false,\n style: {}\n });\n };\n\n window.addEventListener('mouseup', onMouseUp);\n };\n\n const onMouseMove = (event) => {\n if (boundsSelection.showing) {\n const boundingRect = stateController.primaryRenderer.boundingRect;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n\n setBoundsSelection(({ start }) => {\n return {\n showing: true,\n start,\n style: {\n left: Math.min(x, start.x),\n top: autoscaleY ? 0 : Math.min(y, start.y),\n width: Math.abs(x - start.x),\n height: autoscaleY ? boundingRect.height : Math.abs(y - start.y)\n }\n };\n });\n }\n };\n\n useEffect(() => {\n const onScroll = () => {\n if (!showTooltips) {\n return;\n }\n\n stateController.recalculateTooltips();\n };\n\n const onGlobalMouseMove = (event) => {\n if (!showTooltips) {\n return;\n }\n\n stateController.setTooltipMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey\n });\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('mousemove', onGlobalMouseMove, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('mousemove', onGlobalMouseMove);\n };\n }, []);\n\n const onMouseLeave = () => {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n };\n\n const onClick = (event) => {\n stateController.registerClick({\n clientX: event.clientX,\n clientY: event.clientY\n });\n\n if (tooltipOptions && tooltipOptions.savingDisabled) {\n stateController.clearSavedTooltips();\n return;\n }\n\n // if it's NOT a child of 'grapher-context-menu', close the context menu\n if (!event.target.closest('.grapher-context-menu')) {\n stateController.setContextMenuMousePosition({\n showing: false\n });\n }\n\n if (!window.getSelection || window.getSelection().type !== 'Range') {\n stateController.toggleTooltipSaved();\n }\n\n if (onPointClick) {\n const seriesToNearestPoint = {};\n\n const series = stateController.series;\n for (let i = 0; i < series.length; i++) {\n const singleSeries = series[i];\n\n const sizing = stateController.sizing;\n const bounds = singleSeries.axis.currentBounds;\n // const trueX = event.clientX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n const trueX = stateController.tooltipState.mouseX/sizing.elementWidth * (bounds.maxX - bounds.minX) + bounds.minX;\n\n let data = singleSeries.inDataSpace;\n if (singleSeries.ignoreDiscontinuities) {\n data = data.filter((tuple) => typeof tuple[1] === 'number');\n }\n \n const closestIndex = binarySearch(data, trueX, { returnIndex: true });\n const closestPoint = data[closestIndex];\n\n seriesToNearestPoint[singleSeries.name] = closestPoint[0];\n }\n\n\n\n onPointClick(event, seriesToNearestPoint);\n }\n };\n const onDoubleClick = () => {\n stateController.clearSavedTooltips();\n };\n \n const onContextMenu = (event) => {\n event.preventDefault();\n stateController.setContextMenuMousePosition({\n clientX: event.clientX,\n clientY: event.clientY,\n showing: true\n });\n };\n\n return (\n <div className=\"graph-body graph-body-primary\"\n onMouseMove={onMouseMove}\n onMouseLeave={onMouseLeave}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onContextMenu={onContextMenu}\n style={typeof bodyHeight === 'number' ? { height: bodyHeight } : undefined}\n >\n <canvas ref={canvasEl} />\n\n {\n showTooltips &&\n <Tooltip\n axisCount={axisCount}\n maxPrecision={maxPrecision}\n clockStyle={clockStyle}\n timeZone={timeZone}\n {...(tooltipOptions || {})}\n {...tooltip}\n />\n }\n\n {\n contextMenu.showing &&\n <ContextMenu\n contextMenu={contextMenu}\n />\n }\n\n {\n showAnnotations &&\n <Annotations\n bodyHeight={bodyHeight || stateController?.primaryRenderer?.boundingRect?.height}\n annotationState={annotationState}\n />\n }\n\n {\n verticalLines &&\n <VerticalLines\n stateController={stateController}\n verticalLines={verticalLines}\n />\n }\n\n {\n draggablePoints &&\n <DraggablePoints\n stateController={stateController}\n draggablePoints={draggablePoints}\n onPointDrag={onPointDrag}\n onDraggablePointsDoubleClick={onDraggablePointsDoubleClick}\n />\n }\n\n {\n boundsSelectionEnabled && boundsSelection.showing &&\n <div className=\"bounds-selection\"\n style={boundsSelection.style}\n />\n }\n </div>\n );\n}\n\nGraphBody.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n bodyHeight: PropTypes.number,\n boundsSelectionEnabled: PropTypes.bool.isRequired,\n showTooltips: PropTypes.bool.isRequired,\n tooltipOptions: CustomPropTypes.TooltipOptions,\n verticalLines: CustomPropTypes.VerticalLines,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n onPointClick: PropTypes.func,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string\n};\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./grapher.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import {startOfDayInTimezone} from './format';\n\nfunction placeTick(trueValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let scaledValue = trueValue;\n\n if (scale === 'log') {\n scaledValue = 10**trueValue;\n }\n\n let percent = (trueValue - min)/(max - min);\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let pixelValue = percent * totalSize;\n if (isNaN(pixelValue)) {\n pixelValue = 0;\n }\n\n return {\n pixelValue,\n trueValue: scaledValue,\n label: formatter(scaledValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction placeTickByPixel(pixelValue, {scale, min, max, inverted, totalSize, precision, formatter, dates, justTime, justDate, formatOptions={} }, opts={}) {\n let percent = pixelValue/totalSize;\n if (inverted) {\n percent = 1.0 - percent;\n }\n\n let trueValue = percent * (max - min) + min;\n\n if (scale === 'log') {\n trueValue = Math.pow(10, trueValue);\n }\n\n return {\n pixelValue,\n trueValue,\n label: formatter(trueValue, { ...formatOptions, precision, log: scale === 'log', dates, justTime, justDate }),\n size: 'major',\n ...opts\n };\n}\n\nfunction roundToEvenNumber(value, tickSpacing) {\n return Math.round(value/tickSpacing)*tickSpacing;\n}\n\nfunction getEvenTickSpacing(span, desiredCount) {\n const subspan = span/desiredCount;\n\n const precision = -Math.log10(Math.abs(subspan)) + 1;\n const multiplier = (precision - Math.floor(precision)) > 0.5 ? 2 : 1;\n\n const roundTo = 10**Math.floor(precision) * multiplier;\n\n return Math.round(subspan * roundTo)/roundTo;\n}\n\nfunction roundToDivisor(value, divisor) {\n if (value <= 1) {\n return 1;\n }\n\n if (divisor === 1) {\n return Math.round(value);\n }\n\n if (value >= divisor) {\n return Math.round(value/divisor)*divisor;\n }\n\n let divisors;\n if (divisor === 24) {\n divisors = [1, 2, 6, 12, 24];\n } else if (divisor === 60) {\n divisors = [1, 2, 5, 10, 15, 30, 60];\n } else {\n throw new Error('Invalid divisor');\n }\n\n let bestDelta = Infinity;\n let bestDivisor = 1;\n for (let i = 0; i < divisors.length; i++) {\n const delta = Math.abs(divisors[i] - value);\n if (delta < bestDelta) {\n bestDivisor = divisors[i];\n bestDelta = delta;\n }\n }\n\n return bestDivisor;\n}\n\nfunction getEvenDateTickSpacing(span, desiredCount, unitOverride) {\n const subspan = span / desiredCount;\n\n if (subspan < 60*1000 && (!unitOverride || unitOverride === 'second')) {\n return {\n amount: roundToDivisor(subspan/1000, 60),\n unit: 's'\n };\n }\n\n if (subspan < 60*60*1000 && (!unitOverride || unitOverride === 'minute')) {\n return {\n amount: roundToDivisor(subspan/(60*1000), 60),\n unit: 'm'\n };\n }\n\n if (subspan < 24*60*60*1000 && (!unitOverride || unitOverride === 'hour')) {\n return {\n amount: roundToDivisor(subspan/(60*60*1000), 24),\n unit: 'h'\n };\n }\n\n if (unitOverride === 'day' || (subspan < 30*24*60*60*1000 && !unitOverride)) {\n return {\n amount: roundToDivisor(subspan/(24*60*60*1000), 1),\n unit: 'd'\n };\n }\n\n if (subspan > 30*24*60*60*1000 && (!unitOverride || unitOverride === 'month')) {\n return {\n amount: roundToDivisor(subspan/30*24*60*60*1000, 1),\n unit: 'month'\n };\n }\n\n if (unitOverride === 'year') {\n return {\n amount: roundToDivisor(subspan/365*24*60*60*1000, 1),\n unit: 'year'\n };\n }\n\n return {\n unit: 'm',\n amount: 60\n };\n}\n\nfunction placeNumbersGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: false };\n\n const labelCount = Math.floor((totalSize - expectedLabelSize*2)/paddedLabelSize);\n const tickSpacing = getEvenTickSpacing(max - min, labelCount);\n if (tickSpacing > 0) {\n for (let value = roundToEvenNumber(min, tickSpacing); value < max; value += tickSpacing) {\n ticks.push(placeTick(value, placementParams));\n }\n }\n\n if (ticks.length) {\n if (inverted && ticks[ticks.length - 1].pixelValue > labelPadding) {\n ticks.push(placeTickByPixel(expectedLabelSize / 2, placementParams));\n }\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nfunction placeDatesGrid({ min, max, precision, expectedLabelSize, labelPadding, totalSize, skipFirst=false, skipLast=false, scale='linear', formatter, inverted=false, formatOptions }) {\n const paddedLabelSize = expectedLabelSize + 2*labelPadding;\n\n const ticks = [];\n const placementParams = {scale, min, max, inverted, totalSize, precision, formatter, formatOptions, dates: true };\n\n const { amount, unit } = getEvenDateTickSpacing(max - min, totalSize/paddedLabelSize, formatOptions.unitOverride);\n\n const justDate = unit === 'month';\n\n if (!skipFirst) {\n ticks.push(placeTickByPixel(0, {...placementParams, justDate}, {position: 'first'}));\n }\n\n let currentDate = new Date(min);\n\n if (unit === 'h') {\n currentDate.setMinutes(0, 0, 0);\n } else if (unit === 'm') {\n currentDate.setSeconds(0, 0);\n } else if (unit === 's') {\n currentDate.setMilliseconds(0);\n } else if (unit === 'month') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n currentDate.setDate(1);\n } else if (unit === 'd') {\n currentDate = startOfDayInTimezone(currentDate, formatOptions.timeZone);\n }\n\n let lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n while (currentDate < max) {\n let delta = 24*60*60*1000;\n\n if (unit === 'h') {\n delta = (amount - currentDate.getHours() % amount)*60*60*1000;\n } else if (unit === 'm') {\n delta = (amount - currentDate.getMinutes() % amount)*60*1000;\n } else if (unit === 's') {\n delta = (amount - currentDate.getSeconds() % amount)*1000;\n } else if (unit === 'month') {\n delta = 0;\n if (currentDate.getMonth() === 11) {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 1);\n } else {\n currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n }\n } else if (unit === 'year') {\n currentDate = new Date(currentDate.getFullYear() + 1, 0, 0);\n }\n\n currentDate = new Date(currentDate.valueOf() + delta);\n\n const justTime = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true }) === lastDateString;\n\n const tick = placeTick(currentDate, {...placementParams, justTime, justDate});\n\n if (ticks.length && (tick.pixelValue - ticks[ticks.length - 1].pixelValue) < (expectedLabelSize + (labelPadding || 0))) {\n continue;\n }\n\n if (tick.pixelValue + expectedLabelSize/2 >= totalSize) {\n continue;\n }\n\n ticks.push(tick);\n lastDateString = formatter(currentDate, {...formatOptions, ...placementParams, justDate: true });\n }\n\n const justTime = lastDateString === formatter(max, {...formatOptions, ...placementParams, justDate: true });\n\n if (!skipLast && ticks[ticks.length - 1].pixelValue + expectedLabelSize < totalSize) {\n ticks.push(placeTickByPixel(totalSize, {...placementParams, justTime, justDate}, {position: 'last'}));\n }\n\n return ticks.filter(({ pixelValue }) => pixelValue <= totalSize && pixelValue >= 0);\n}\n\nexport default function placeGrid(opts) {\n if (opts.dates) {\n return placeDatesGrid(opts);\n } else {\n return placeNumbersGrid(opts);\n }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, calculateTimePrecision, formatX} from '../helpers/format';\nimport placeGrid from '../helpers/place_grid';\nimport {useEnumMap, useHasXEnum, usePrimarySize, useSelection} from '../state/hooks';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(XAxis);\n\nfunction XAxis({ showAxes, showGrid, stateController, bigLabels, xTickUnit, clockStyle, timeZone, integersOnly, formatXAxisLabel }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n const {minX, maxX, dates} = useSelection(stateController);\n const hasXEnum = useHasXEnum(stateController);\n const enumMap = useEnumMap(stateController);\n\n let precision;\n if (dates) {\n precision = calculateTimePrecision(minX, maxX);\n } else {\n precision = calculatePrecision(maxX - minX);\n }\n\n let inverseEnumMap = null;\n if (hasXEnum) {\n inverseEnumMap = {};\n for (const [key, value] of Object.entries(enumMap)) {\n inverseEnumMap[value] = key;\n }\n }\n\n const formatOptions = {\n unitOverride: xTickUnit,\n clockStyle,\n timeZone,\n integersOnly,\n inverseEnumMap,\n formatter: formatXAxisLabel\n };\n\n const minLabel = formatX(minX, {...formatOptions, dates, precision }).toString();\n const maxLabel = formatX(maxX, {...formatOptions, dates, precision }).toString();\n\n let expectedLabelWidth = Math.max(minLabel.length, maxLabel.length) * 4;\n if (bigLabels) {\n expectedLabelWidth *= 2;\n }\n\n const labelPadding = 30; // space in between labels in the expected case\n\n const ticks = placeGrid({\n min: minX,\n max: maxX,\n totalSize: elementWidth,\n precision,\n dates,\n formatter: formatXAxisLabel || formatX,\n expectedLabelSize: expectedLabelWidth,\n labelPadding,\n formatOptions\n });\n\n const xAxisHeight = 20;\n\n return (\n <svg className=\"axis x-axis\" style={showAxes ? undefined : {marginBottom: -20}}>\n {\n showAxes &&\n <path d={`M-1,0 H${elementWidth}`} className=\"axis-line\" />\n }\n {\n showAxes &&\n <path d={`M-2,1 H${elementWidth + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, position, skipGrid }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showAxes &&\n <path d={`M${pixelValue},1 v6`} className=\"axis-tick\" />\n }\n\n {\n showGrid && !skipGrid &&\n <path d={`M${pixelValue},0 v-${elementHeight}`} />\n }\n\n {\n showAxes &&\n <text x={pixelValue} y={xAxisHeight - 5}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n </svg>\n );\n}\n\nXAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string,\n integersOnly: PropTypes.bool,\n formatXAxisLabel: PropTypes.func\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {calculatePrecision, formatY} from '../helpers/format';\nimport {Y_AXIS_WIDTH, BIG_Y_AXIS_LABEL_OFFSET} from '../helpers/axis_sizes';\nimport scaleBounds from '../renderer/scale_bounds';\nimport getColor from '../helpers/colors';\nimport placeGrid from '../helpers/place_grid';\nimport {useAxes, useAxisBounds, useHighlightedSeries, usePrimarySize} from '../state/hooks';\nimport StateController from '../state/state_controller';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default React.memo(YAxis);\n\nfunction YAxis({ stateController, showAxes, showGrid, showSeriesKey, axis, sideIndex, bodyHeight, theme, grapherID, dragPositionYOffset=0, bigLabels, showAxisColors }) {\n if (!showAxes && !showGrid) {\n return null;\n }\n\n const { side, scale, axisIndex, label } = useAxes(stateController)[axis.axisIndex];\n\n const { elementWidth, elementHeight } = usePrimarySize(stateController);\n let { minY, maxY } = useAxisBounds(stateController)[axisIndex];\n\n const scaledBounds = scaleBounds({ minY, maxY, scale});\n minY = scaledBounds.minY;\n maxY = scaledBounds.maxY;\n\n const ticks = placeGrid({\n min: minY,\n max: maxY,\n totalSize: elementHeight,\n scale,\n precision: calculatePrecision(maxY - minY),\n formatter: formatY,\n inverted: true,\n expectedLabelSize: bigLabels ? 20 : 10,\n labelPadding: 30\n });\n\n const colorBoxSize = 10;\n const colorBoxPadding = 4;\n\n let sidePadding = 5;\n\n if (scale === 'log') {\n sidePadding = 2;\n }\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragDelta, setDragDelta] = useState({ dx: 0, dy: 0 });\n\n const startDrag = (event, singleSeries) => {\n let startX = event.clientX;\n let startY = event.clientY;\n\n if (side === 'left') {\n startX += Y_AXIS_WIDTH;\n }\n\n if (side === 'right') {\n startX -= Y_AXIS_WIDTH;\n }\n\n setDragDelta({\n dx: 0,\n dy: 0\n });\n\n const onMouseMove = (moveEvent) => {\n setDragDelta({\n dx: moveEvent.clientX - startX,\n dy: moveEvent.clientY - startY\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n setDraggedSeries(singleSeries);\n stateController.markDragStart();\n };\n\n const highlightedOpacity = theme === 'day' ? 1.0 : 0.5;\n const unhighlightedOpacity = theme === 'day' ? 0.8 : 0.3;\n\n return (\n <svg className={`axis y-axis y-axis-${side}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n style={{\n width: Y_AXIS_WIDTH,\n marginLeft: showAxes ? undefined : -Y_AXIS_WIDTH,\n height: typeof bodyHeight === 'number' ? bodyHeight : undefined\n }}\n >\n {\n showAxes &&\n showAxisColors &&\n axis.series.map((singleSeries, i) => {\n const height = elementHeight/axis.series.length;\n\n return (\n <rect\n x={side === 'left' ? 0 : 2}\n y={i*height}\n width={Y_AXIS_WIDTH - 2}\n height={height}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n opacity={singleSeries.index === highlightedSeries ? highlightedOpacity : unhighlightedOpacity}\n data-element-height={elementHeight}\n data-series-length={axis.series.length}\n />\n );\n })\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-1 : 1},3 V${elementHeight}`} className=\"axis-line\" />\n }\n\n {\n showAxes &&\n <path d={`M${side === 'left' ? Y_AXIS_WIDTH-2 : 0},3 V${elementHeight + 1}`} className=\"axis-line-shadow\" />\n }\n\n {\n ticks.map(({ pixelValue, label, size, skipGrid }, i) => {\n const edge = side === 'left' ? (sideIndex + 1) * Y_AXIS_WIDTH : -sideIndex*Y_AXIS_WIDTH;\n const length = (side === 'left' ? 1 : - 1) * (elementWidth+1);\n\n const classes = ['axis-item', `axis-item-${size}`];\n if (bigLabels) {\n classes.push('axis-item-big-labels');\n }\n\n return (\n <g key={i} className={classes.join(' ')}>\n {\n showGrid &&\n !skipGrid &&\n <path d={`M${edge},${pixelValue} h${length}`} />\n }\n\n {\n showGrid &&\n !skipGrid &&\n sideIndex > 0 &&\n <path\n d={`M${side === 'left' ? Y_AXIS_WIDTH : 0},${pixelValue} h${(side === 'left' ? 1 : -1) * sideIndex * Y_AXIS_WIDTH}`}\n strokeDasharray={'2,2'}\n />\n }\n\n {\n showAxes &&\n <text x={side === 'left' ? Y_AXIS_WIDTH-sidePadding : sidePadding} y={pixelValue}>\n {label}\n </text>\n }\n </g>\n );\n })\n }\n\n {\n showSeriesKey && showAxes &&\n axis.series.map((singleSeries, i) => {\n\n let x = (Y_AXIS_WIDTH - colorBoxSize - colorBoxPadding) + (i % 2 - 1)*(colorBoxSize + colorBoxPadding);\n let y = -(colorBoxPadding + colorBoxSize) * Math.ceil(axis.series.length / 2) + (colorBoxSize + colorBoxPadding) * Math.floor(i / 2);\n\n if (singleSeries === draggedSeries) {\n x += dragDelta.dx;\n y += dragDelta.dy - dragPositionYOffset;\n }\n\n return (\n <rect\n className=\"series-color-box\"\n onMouseDown={(event) => startDrag(event, singleSeries)}\n x={x}\n y={y}\n width={colorBoxSize}\n height={colorBoxSize}\n key={singleSeries.index}\n fill={getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex)}\n onMouseOver={() => stateController.setHighlightedSeries(singleSeries.index)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n />\n );\n })\n }\n\n {\n showAxes && !!label &&\n <text\n className={`y-axis-label${bigLabels ? ' y-axis-big-label' : ''}`}\n x={side === 'left' ? 10 : Y_AXIS_WIDTH - 10}\n y={elementHeight/2 + (side === 'left' ? -1 : 1)*(axisIndex + 1)*(bigLabels ? BIG_Y_AXIS_LABEL_OFFSET : 0)}\n transform={`rotate(${side === 'left' ? -90 : 90}, ${side === 'left' ? 10 : Y_AXIS_WIDTH - 10}, ${elementHeight/2})`}\n >\n {label}\n </text>\n }\n </svg>\n );\n}\n\nYAxis.propTypes = {\n stateController: PropTypes.instanceOf(StateController),\n showAxes: PropTypes.bool.isRequired,\n showGrid: PropTypes.bool.isRequired,\n showAxisColors: PropTypes.bool.isRequired,\n showSeriesKey: PropTypes.bool.isRequired,\n axis: CustomPropTypes.Axis.isRequired,\n sideIndex: PropTypes.number.isRequired,\n bodyHeight: PropTypes.number,\n theme: PropTypes.string,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n bigLabels: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(RangeSelectionButtonBase);\n\nfunction RangeSelectionButtonBase({ selected, disabled, className, onClick, children, description }) {\n const classes = [\n 'range-button'\n ];\n\n if (selected) {\n classes.push('range-button-selected');\n }\n\n if (disabled) {\n classes.push('range-button-disabled');\n }\n\n if (className) {\n classes.push(className);\n }\n\n if (description) {\n classes.push('option-tooltip');\n }\n\n return (\n <div\n className={classes.join(' ')}\n onClick={onClick && ((event) => disabled || onClick(event))}\n >\n {children}\n\n {\n description &&\n <div className=\"option-tooltip-text\">\n {description}\n </div>\n }\n </div>\n );\n}\n\nRangeSelectionButtonBase.propTypes = {\n selected: PropTypes.bool.isRequired,\n onClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n description: PropTypes.string\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(RangeSelectionButton);\n\nfunction RangeSelectionButton({ stateController, currentBoundCalculator, boundCalculator, children, disabled }) {\n return (\n <RangeSelectionButtonBase\n selected={currentBoundCalculator === boundCalculator}\n onClick={() => stateController.boundCalculator = boundCalculator}\n disabled={disabled}\n >\n {children}\n </RangeSelectionButtonBase>\n );\n}\n\nRangeSelectionButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n boundCalculator: PropTypes.func.isRequired,\n currentBoundCalculator: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n disabled: PropTypes.bool\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport StateController from '../state/state_controller';\nimport {usePercentile, usePercentileAsymmetry} from '../state/hooks';\n\nexport default React.memo(PercentileButton);\n\nfunction PercentileButton({ stateController }) {\n const percentile = usePercentile(stateController);\n const percentileAsymmetry = usePercentileAsymmetry(stateController);\n const [showing, setShowing] = useState(false);\n\n return ([\n showing ? <RangeSelectionButtonBase\n key=\"asymmetry button\"\n className=\"percentile-button\"\n selected={true}\n description=\"Percentile asymmetry\"\n >\n <input\n onClick={(e) => e.stopPropagation()}\n value={percentileAsymmetry}\n onChange={(e) => stateController.percentileAsymmetry = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={-50}\n max={50}\n />\n\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M240 96h64a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16h-64a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm0 128h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zm256 192H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h256a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm-256-64h192a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H240a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16zM16 160h48v304a16 16 0 0 0 16 16h32a16 16 0 0 0 16-16V160h48c14.21 0 21.39-17.24 11.31-27.31l-80-96a16 16 0 0 0-22.62 0l-80 96C-5.35 142.74 1.78 160 16 160z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>: null,\n\n <RangeSelectionButtonBase\n key=\"main-button\"\n className=\"percentile-button\"\n selected={showing || parseFloat(percentile) !== 100}\n onClick={() => setShowing(!showing)}\n description=\"Edit percentile\"\n >\n {\n showing &&\n <div>\n <input\n onClick={(e) => e.stopPropagation()}\n autoFocus={true}\n value={percentile}\n onChange={(e) => stateController.percentile = e.target.value}\n onKeyUp={(e) => e.keyCode === 13 && setShowing(false)}\n type=\"number\"\n min={0}\n max={100}\n />\n </div>\n }\n\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M112 224c61.9 0 112-50.1 112-112S173.9 0 112 0 0 50.1 0 112s50.1 112 112 112zm0-160c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm224 224c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112zm0 160c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zM392.3.2l31.6-.1c19.4-.1 30.9 21.8 19.7 37.8L77.4 501.6a23.95 23.95 0 0 1-19.6 10.2l-33.4.1c-19.5 0-30.9-21.9-19.7-37.8l368-463.7C377.2 4 384.5.2 392.3.2z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n ]);\n}\n\nPercentileButton.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","import React from 'react';\nimport PercentileButton from './percentile_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {\n useAutoscaleY,\n useMaxPrecision,\n useShowIndividualPoints, useShowingAnnotations,\n useShowingSidebar, useTheme\n} from '../state/hooks';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default React.memo(Options);\n\nfunction Options({stateController, sidebarEnabled}) {\n\n const showIndividualPoints = useShowIndividualPoints(stateController);\n const autoscaleY = useAutoscaleY(stateController);\n const maxPrecision = useMaxPrecision(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n const showingAnnotations = useShowingAnnotations(stateController);\n const theme = useTheme(stateController);\n\n return (\n <div className=\"options-bar\">\n {\n sidebarEnabled &&\n <RangeSelectionButtonBase\n selected={showingSidebar}\n onClick={() => stateController.toggleShowingSidebar()}\n description=\"Show sidebar\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n }\n\n <RangeSelectionButtonBase\n selected={theme === 'export'}\n onClick={() => stateController.toggleExportMode()}\n description=\"Export mode\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showingAnnotations}\n onClick={() => stateController.toggleShowingAnnotations()}\n description=\"Show annotations\"\n >\n <div className=\"icon-container icon-container-448\">\n <svg focusable=\"false\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <PercentileButton stateController={stateController} />\n\n <RangeSelectionButtonBase\n selected={maxPrecision}\n onClick={() => stateController.toggleMaxPrecision()}\n description=\"Max precision\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={autoscaleY}\n onClick={() => stateController.toggleYAutoscaling()}\n description=\"Autoscale y axis\"\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M168 416c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88v-64h-88c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h88V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v448c0 17.67 14.33 32 32 32h192c17.67 0 32-14.33 32-32v-64h-88z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n <RangeSelectionButtonBase\n selected={showIndividualPoints}\n onClick={() => stateController.toggleIndividualPoints()}\n description=\"Show individual points\"\n >\n <div className=\"icon-container icon-container-narrow\">\n <svg focusable=\"false\" viewBox=\"0 0 192 512\">\n <path fill=\"currentColor\" d=\"M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n </div>\n );\n}\n\nOptions.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport RangeSelectionButton from './range_selection_button.jsx';\nimport RangeSelectionButtonBase from './range_selection_button_base.jsx';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport StateController from '../state/state_controller';\nimport {\n useBoundCalculator, useBoundHistory,\n useGlobalBounds,\n useLeftAxisCount,\n useRightAxisCount,\n useShowingOptions\n} from '../state/hooks';\nimport BOUND_CALCULATORS from '../state/bound_calculators';\nimport Options from './options.jsx';\n\nexport default React.memo(RangeSelection);\n\nfunction RangeSelection({stateController, customBoundsSelectors, customBoundsSelectorsOnly, sidebarEnabled}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n const { dates } = useGlobalBounds(stateController);\n\n const currentBoundCalculator = useBoundCalculator(stateController);\n const { hasPreviousBounds, hasNextBounds } = useBoundHistory(stateController);\n\n const customBoundSelectorNames = new Set(customBoundsSelectors.map(({ label }) => label));\n\n return (\n <div className={`range-selection${dates ? '' : ' range-not-dates'}`} style={{ marginRight, marginLeft }}>\n <div className=\"range-buttons\">\n {\n showingOptions &&\n <Options\n stateController={stateController}\n sidebarEnabled={sidebarEnabled}\n />\n }\n\n <RangeSelectionButtonBase\n className=\"showing-options-button\"\n selected={showingOptions}\n onClick={() => stateController.toggleShowingOptions()}\n description=\"Show additional options\"\n >\n <div className=\"icon-container icon-container-square\">\n <svg focusable=\"false\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.previousBounds()}\n disabled={!hasPreviousBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z\" />\n </svg>\n </div>\n </RangeSelectionButtonBase>\n \n <RangeSelectionButtonBase\n className=\"range-selection-history\"\n selected={false}\n onClick={() => stateController.nextBounds()}\n disabled={!hasNextBounds}\n >\n <div className=\"icon-container\">\n <svg focusable=\"false\" viewBox=\"0 0 256 512\">\n <path fill=\"currentColor\" d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"/>\n </svg>\n </div>\n </RangeSelectionButtonBase>\n\n {\n customBoundsSelectors.map(({label, calculator, datesOnly}, i) => {\n return (\n <RangeSelectionButton\n key={i}\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={calculator}\n disabled={datesOnly && !dates}\n >\n {label}\n </RangeSelectionButton>\n );\n })\n }\n\n {\n !customBoundSelectorNames.has('1m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastMinute}\n disabled={!dates}\n >\n 1m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('10m') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.last10Minutes}\n disabled={!dates}\n >\n 10m\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1h') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastHour}\n disabled={!dates}\n >\n 1h\n </RangeSelectionButton>\n }\n\n {\n !customBoundSelectorNames.has('1d') && !customBoundsSelectorsOnly &&\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.lastDay}\n disabled={!dates}\n >\n 1d\n </RangeSelectionButton>\n }\n\n <RangeSelectionButton\n stateController={stateController}\n currentBoundCalculator={currentBoundCalculator}\n boundCalculator={BOUND_CALCULATORS.all}\n disabled={false}\n >\n All\n </RangeSelectionButton>\n </div>\n </div>\n );\n\n}\n\nRangeSelection.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors.isRequired,\n customBoundsSelectorsOnly: PropTypes.bool,\n sidebarEnabled: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GraphBodyRenderer from '../renderer/graph_body_renderer';\nimport StateController from '../state/state_controller';\nimport placeGrid from '../helpers/place_grid';\nimport {formatX} from '../helpers/format';\nimport VerticalLines from './vertical_lines.jsx';\nimport CustomPropTypes from '../helpers/custom_prop_types';\n\nexport default class RangeGraph extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n elementWidth: 0,\n elementHeight: 0,\n selectionBounds: {\n minX: 0,\n maxX: 0\n },\n globalBounds: {\n minX: 0,\n maxX: 0\n }\n };\n\n this.onMouseMove = this.onMouseMove.bind(this);\n this.stopDragging = this.stopDragging.bind(this);\n this.startScroll = this.startScroll.bind(this);\n this.startLeftDrag = this.startLeftDrag.bind(this);\n this.startRightDrag = this.startRightDrag.bind(this);\n }\n\n componentDidMount() {\n this._renderer = new GraphBodyRenderer({\n stateController: this.props.stateController,\n canvasElement: this.el,\n webgl: this.props.webgl,\n checkIntersection: this.props.checkIntersection\n });\n this.props.stateController.rangeGraphRenderer = this._renderer;\n\n this._renderer.on('size_changed', (sizing) => {\n this.setState(sizing);\n });\n\n this.setState({\n selectionBounds: this.props.stateController._selection,\n globalBounds: this.props.stateController._globalBounds\n });\n\n this.props.stateController.on('selection_changed', (selectionBounds) =>{\n this.setState({ selectionBounds });\n });\n\n this.props.stateController.on('global_bounds_changed', (globalBounds) =>{\n this.setState({ globalBounds: globalBounds });\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.draggingY !== this.props.draggingY) {\n this._renderer.resize();\n }\n }\n\n componentWillUnmount() {\n this._renderer.dispose();\n this._renderer = null;\n }\n\n onMouseMove(event) {\n if (!this._dragType) {\n return;\n }\n\n let boundCalculator;\n const leftX = this.el.getBoundingClientRect().left;\n\n this.setState(({selectionBounds, globalBounds, elementWidth}) => {\n const pixelX = event.clientX - leftX;\n let percentage = pixelX/elementWidth;\n\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n\n let trueX = percentage * (globalBounds.maxX - globalBounds.minX) + globalBounds.minX;\n\n if (this._dragType === 'scroll') {\n const range = selectionBounds.maxX - selectionBounds.minX;\n let minX = trueX - range*this._scrollAnchorPercentage;\n let maxX = trueX + range*(1-this._scrollAnchorPercentage);\n\n if (minX < globalBounds.minX) {\n minX = globalBounds.minX;\n maxX = minX + range;\n }\n\n if (maxX > globalBounds.maxX) {\n maxX = globalBounds.maxX;\n minX = maxX - range;\n }\n\n boundCalculator = () => {\n return {minX, maxX};\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX, maxX\n })\n };\n } else if (this._dragType === 'left') {\n if (trueX > selectionBounds.maxX) {\n trueX = selectionBounds.maxX;\n }\n\n const boundToRight = globalBounds.maxX === selectionBounds.maxX;\n\n boundCalculator = () => {\n if (boundToRight) {\n return {\n minX: trueX\n };\n } else {\n return {\n minX: trueX,\n maxX: selectionBounds.maxX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n minX: trueX\n })\n };\n } else if (this._dragType === 'right') {\n if (trueX < selectionBounds.minX) {\n trueX = selectionBounds.minX;\n }\n\n const boundToLeft = globalBounds.minX === selectionBounds.minX;\n\n boundCalculator = () => {\n if (boundToLeft) {\n return {\n maxX: trueX\n };\n } else {\n return {\n minX: selectionBounds.minX,\n maxX: trueX\n };\n }\n };\n\n return {\n selectionBounds: Object.assign({}, selectionBounds, {\n maxX: trueX\n })\n };\n }\n }, () => {\n if (!boundCalculator) {\n return;\n }\n\n boundCalculator.debounceHistory = true;\n this.props.stateController.boundCalculator = boundCalculator;\n });\n }\n\n addListeners() {\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.stopDragging);\n }\n\n stopDragging() {\n this._dragType = null;\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.stopDragging);\n }\n\n startScroll(event) {\n this._dragType = 'scroll';\n\n const {selectionBounds, globalBounds, elementWidth} = this.state;\n const leftX = this.el.getBoundingClientRect().left;\n\n const pixelStartX = event.clientX - leftX;\n const pixelMinX = (selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n const pixelMaxX = (selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX) * elementWidth || 0;\n\n this._scrollAnchorPercentage = (pixelStartX-pixelMinX)/(pixelMaxX - pixelMinX);\n this.addListeners();\n }\n\n startLeftDrag() {\n this._dragType = 'left';\n this.addListeners();\n }\n\n startRightDrag() {\n this._dragType = 'right';\n this.addListeners();\n }\n\n render() {\n const { globalBounds, selectionBounds, elementWidth, elementHeight } = this.state;\n\n let pixelMinX = Math.min(Math.max((selectionBounds.minX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n let pixelMaxX = Math.min(Math.max((selectionBounds.maxX - globalBounds.minX)/(globalBounds.maxX - globalBounds.minX), 0), 1) * elementWidth || 0;\n\n if (isNaN(pixelMinX) || !isFinite(pixelMinX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMinX = 0;\n }\n\n if (isNaN(pixelMaxX) || !isFinite(pixelMaxX) || selectionBounds.maxX < selectionBounds.minX) {\n pixelMaxX = 0;\n }\n\n const barSize = 14;\n let ticks;\n\n if (selectionBounds.dates && this.props.markDates) {\n ticks = placeGrid({\n min: globalBounds.minX,\n max: globalBounds.maxX,\n totalSize: elementWidth,\n precision: 'day',\n dates: selectionBounds.dates,\n formatter: formatX,\n expectedLabelSize: 30,\n labelPadding: 5,\n formatOptions: {\n justMonthAndDay: true,\n unitOverride: 'day',\n timeZone: this.props.timeZone\n },\n skipFirst: true,\n skipLast: true\n });\n }\n\n return (\n <div className=\"range-selection-graph\">\n <div className=\"graph-body graph-body-secondary\">\n <canvas ref={(el) => this.el = el} />\n\n <svg>\n <g>\n <rect\n x={0}\n y={elementHeight}\n width={elementWidth}\n height={barSize}\n className=\"selection-bar-track\"\n />\n\n {\n ticks && ticks.map(({ pixelValue, label, size, position }, i) => {\n if (isNaN(pixelValue)) {\n return null;\n }\n\n const classes = ['axis-item', `axis-item-${size}`, `axis-item-${position}`];\n\n return (\n <g key={i} className={classes.join(' ')}>\n <path d={`M${pixelValue},0 v${elementHeight}`} />\n\n <text x={pixelValue + 3} y={elementHeight}>\n {label}\n </text>\n </g>\n );\n })\n }\n\n <rect\n x={pixelMinX}\n y={elementHeight}\n width={pixelMaxX - pixelMinX}\n height={barSize}\n className=\"selection-bar\"\n onMouseDown={this.startScroll}\n />\n\n <path\n d=\"M -3 3.5 L -3 9.333333333333334 M 0 3.5 L 0 9.333333333333334 M 3 3.5 L 3 9.333333333333334\"\n className=\"selection-bar-rifles\"\n transform={`translate(${pixelMinX + (pixelMaxX - pixelMinX)/2},${elementHeight})`}\n onMouseDown={this.startScroll}\n />\n </g>\n\n <g>\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight}\n className=\"target-selection\"\n onMouseDown={this.startScroll}\n />\n\n <rect\n x={pixelMinX}\n y={0}\n width={pixelMaxX - pixelMinX}\n height={elementHeight + barSize}\n className=\"target-selection-outline\"\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMinX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startLeftDrag}\n />\n </g>\n\n <g>\n <path\n d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n className=\"selection-bar-handle\"\n transform={`translate(${pixelMaxX},${(elementHeight - 15)/2})`}\n onMouseDown={this.startRightDrag}\n />\n </g>\n </svg>\n\n {\n this.props.verticalLines &&\n <VerticalLines\n stateController={this.props.stateController}\n verticalLines={this.props.verticalLines}\n isRangeGraph={true}\n bounds={globalBounds}\n elementHeight={elementHeight}\n elementWidth={elementWidth}\n />\n }\n </div>\n </div>\n );\n }\n\n}\n\nRangeGraph.defaultProps = {\n width: 3,\n shadowColor: 'transparent'\n};\n\nRangeGraph.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n webgl: PropTypes.bool,\n draggingY: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n markDates: PropTypes.bool,\n timeZone: PropTypes.string,\n verticalLines: CustomPropTypes.VerticalLines\n};\n","import React from 'react';\nimport getColor from '../helpers/colors';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport nameForSeries from '../helpers/name_for_series';\n\nexport default React.memo(SeriesKeyItem);\n\nfunction SeriesKeyItem({ series, i, style, onMouseDown, theme, stateController, highlighted }) {\n const color = getColor(series.color, i, series.multigrapherSeriesIndex);\n\n if (theme === 'day') {\n style = Object.assign({}, style, {\n backgroundColor: color\n });\n } else {\n style = Object.assign({}, style, {\n color\n });\n }\n\n const classes = ['series-key-item'];\n if (highlighted) {\n classes.push('series-key-item-highlighted');\n }\n\n const name = nameForSeries(series, i);\n\n return (\n <div\n className={classes.join(' ')}\n style={style}\n onMouseDown={onMouseDown}\n onMouseOver={() => stateController.setHighlightedSeries(i)}\n onMouseOut={() => stateController.setHighlightedSeries(null)}\n onClick={() => stateController.registerSeriesClick(i)}\n >\n {name}\n </div>\n );\n}\n\nSeriesKeyItem.propTypes = {\n series: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController),\n i: PropTypes.number.isRequired,\n style: PropTypes.object,\n onMouseDown: PropTypes.func,\n theme: PropTypes.string.isRequired,\n highlighted: PropTypes.bool\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\n\nexport default class SeriesKeyAxisContainer extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n showingLabelInput: false\n };\n\n this.toggleLabelInputShowing = this.toggleLabelInputShowing.bind(this);\n }\n\n toggleLabelInputShowing() {\n this.setState(({ showingLabelInput }) => {\n return {\n showingLabelInput: !showingLabelInput\n };\n });\n }\n\n render() {\n const {children, stateController, axisIndex, scale, label, grapherID} = this.props;\n\n const { showingLabelInput } = this.state;\n\n return (\n <div\n className={`series-key-axis-container${showingLabelInput ? ' series-key-axis-container-showing-label' : ''}`}\n data-axis-index={axisIndex}\n data-grapher-id={grapherID}\n >\n <div className=\"scale-label\" onClick={() => stateController.toggleScale({axisIndex})}>\n {scale.slice(0, showingLabelInput ? 6 : 3)}\n </div>\n\n <div className=\"series-key-axis-container-body\">\n <div>\n {children}\n\n <svg className=\"label-input-toggler\" viewBox=\"0 0 512 512\" onClick={this.toggleLabelInputShowing}>\n <path\n d=\"M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\"/>\n </svg>\n </div>\n\n <div className=\"series-key-axis-label-container\">\n <input\n onChange={(event) => stateController.setLabel({axisIndex, label: event.target.value})}\n placeholder=\"Enter label\"\n value={label || ''}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nSeriesKeyAxisContainer.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n children: PropTypes.node.isRequired,\n axisIndex: PropTypes.number.isRequired,\n scale: PropTypes.string.isRequired,\n label: PropTypes.string,\n grapherID: PropTypes.string\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {Y_AXIS_WIDTH} from '../helpers/axis_sizes';\nimport StateController from '../state/state_controller';\nimport {\n useAlwaysTooltipped,\n useAxes,\n useHighlightedSeries,\n useLeftAxisCount,\n usePrimarySize,\n useRightAxisCount,\n useSeries, useShowingOptions\n} from '../state/hooks';\nimport SeriesKeyItem from './series_key_item.jsx';\nimport SeriesKeyAxisContainer from './series_key_axis_container.jsx';\n\nfunction calculateStyles({stateController, keyWidth}) {\n const rightAxisCount = useRightAxisCount(stateController);\n const leftAxisCount = useLeftAxisCount(stateController);\n const showingOptions = useShowingOptions(stateController);\n\n let marginRight = Y_AXIS_WIDTH*rightAxisCount;\n if (rightAxisCount > 0) {\n marginRight += 5;\n }\n\n marginRight += 250;\n\n if (showingOptions) {\n marginRight += 70;\n }\n\n let marginLeft = Y_AXIS_WIDTH*leftAxisCount;\n\n if (leftAxisCount > 0) {\n marginLeft += 5;\n }\n\n marginLeft = Math.max(marginRight, marginLeft);\n marginRight = Math.max(marginRight, marginLeft);\n\n let marginBottom;\n\n const { elementWidth } = usePrimarySize(stateController);\n\n const shouldBreak = elementWidth - marginLeft - marginRight < keyWidth;\n\n if (shouldBreak) {\n marginLeft = 0;\n marginRight = 0;\n marginBottom = 10;\n }\n\n return { marginRight, marginLeft, marginBottom };\n}\n\nexport default React.memo(SeriesKey);\n\nfunction SeriesKey({ stateController, theme, draggingY, grapherID, dragPositionYOffset=0 }) {\n const series = useSeries(stateController);\n const [draggedSeries, setDraggedSeries] = useState(null);\n const [dragPosition, setDragPosition] = useState({\n x: 0,\n y: 0\n });\n\n const highlightedSeries = useHighlightedSeries(stateController);\n\n const keyRef = useRef(null);\n const [keyWidth, setKeyWidth] = useState(series.map(({ name, yKey }, i) => (name || yKey || i).toString().length).reduce((a, b) => a + b, 0) * 5);\n\n let sizeCalculationHandle;\n useEffect(() => {\n if (keyRef.current) {\n cancelAnimationFrame(sizeCalculationHandle);\n\n sizeCalculationHandle = requestAnimationFrame(() => {\n if (!keyRef.current) { // has become invalid in the last frame\n return;\n }\n\n const width = [...keyRef.current.querySelectorAll('.series-key-axis-container')]\n .map((el) => el.clientWidth)\n .reduce((a, b) => a + b, 0);\n setKeyWidth(width);\n });\n }\n }, [series, keyRef.current]);\n\n const style = calculateStyles({ stateController, keyWidth });\n\n const axes = useAxes(stateController);\n const alwaysTooltipped = useAlwaysTooltipped(stateController);\n\n const startDragging = (event, singleSeries) => {\n let seriesKeyEl = event.target;\n while (seriesKeyEl && seriesKeyEl.className !== 'series-key') {\n seriesKeyEl = seriesKeyEl.parentNode;\n }\n const targetLeft = event.target.getBoundingClientRect().left;\n let seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n let seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const clientStartX = event.clientX;\n const clientStartY = event.clientY;\n\n setDraggedSeries(singleSeries);\n setDragPosition({\n x: event.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: event.clientY - startY + 1\n });\n\n const onMouseMove = (moveEvent) => {\n if (seriesKeyEl.style.marginLeft !== seriesKeyMarginLeft) {\n seriesKeyLeft = seriesKeyEl.getBoundingClientRect().left;\n seriesKeyMarginLeft = seriesKeyEl.style.marginLeft;\n }\n\n setDragPosition({\n x: moveEvent.clientX - startX + (targetLeft - seriesKeyLeft) - 2,\n y: moveEvent.clientY - startY + 1\n });\n };\n\n const onMouseUp = (mouseUpEvent) => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n\n let target = mouseUpEvent.target;\n while (target && !(target.dataset || {}).axisIndex && !(target.dataset || {}).grapherId) {\n target = target.parentNode;\n }\n\n setDraggedSeries(null);\n stateController.finalizeDrag(singleSeries, target && (target.dataset || {}).axisIndex, target && (target.dataset || {}).grapherId);\n\n if (mouseUpEvent.clientX === clientStartX && mouseUpEvent.clientY === clientStartY) {\n stateController.toggleAlwaysTooltipped(singleSeries, mouseUpEvent.shiftKey);\n }\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n\n stateController.markDragStart();\n };\n\n return (\n <div className=\"series-key\" style={style} ref={keyRef}>\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-left\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n axes.map((axis, i) => {\n if (!axis.series.length && axes.length > 1) {\n return null;\n }\n\n return (\n <SeriesKeyAxisContainer\n key={i}\n label={axis.label}\n axisIndex={axis.axisIndex}\n scale={axis.scale}\n stateController={stateController}\n grapherID={grapherID}\n >\n {\n axis.series.map((singleSeries) => {\n if (singleSeries.hideFromKey) {\n return null;\n }\n\n return (\n <SeriesKeyItem\n key={singleSeries.index}\n series={singleSeries}\n i={singleSeries.index}\n onMouseDown={(event, toggleTooltipped) => startDragging(event, singleSeries, toggleTooltipped)}\n theme={theme}\n stateController={stateController}\n highlighted={highlightedSeries === singleSeries.index || alwaysTooltipped.has(singleSeries)}\n />\n );\n })\n }\n </SeriesKeyAxisContainer>\n );\n })\n }\n\n {\n draggingY &&\n <div\n className=\"series-key-axis-container\"\n data-axis-index=\"new-right\"\n data-grapher-id={grapherID}\n />\n }\n\n {\n draggedSeries &&\n <SeriesKeyItem\n style={{\n left: dragPosition.x,\n top: dragPosition.y - dragPositionYOffset,\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 1\n }}\n series={draggedSeries}\n i={draggedSeries.index}\n theme={theme}\n stateController={stateController}\n />\n }\n </div>\n );\n}\n\nSeriesKey.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired,\n theme: PropTypes.string.isRequired,\n draggingY: PropTypes.bool.isRequired,\n grapherID: PropTypes.string,\n dragPositionYOffset: PropTypes.number\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default React.memo(GraphTitle);\n\nfunction GraphTitle({ title }) {\n return (\n <div className=\"grapher-title\">\n {title}\n </div>\n );\n}\n\nGraphTitle.propTypes = {\n title: PropTypes.string.isRequired\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StateController from '../state/state_controller';\nimport {useSeries} from '../state/hooks';\nimport CustomPropTypes from '../helpers/custom_prop_types';\nimport getColor from '../helpers/colors';\n\nclass SeriesToggle extends React.PureComponent {\n\n constructor(props) {\n super(props);\n\n this.onChange = this.onChange.bind(this);\n }\n\n // NOTE: event listeners here do not follow React best practices, because when handled through React\n // there were ~500ms of latency when toggling the checkbox. It's unclear why\n onChange(event) {\n setTimeout(() => {\n this.props.stateController.setShowing(this.props.singleSeries, event.target.checked);\n });\n }\n\n render() {\n const { singleSeries } = this.props;\n const color = getColor(singleSeries.color, singleSeries.index, singleSeries.multigrapherSeriesIndex);\n\n let name = singleSeries.name || singleSeries.yKey;\n\n if (!name) {\n name = singleSeries.index;\n }\n\n return (\n <div className=\"series-toggle\">\n <label>\n <input\n type=\"checkbox\"\n defaultChecked={!singleSeries.hidden}\n ref={(el) => el && el.addEventListener('change', this.onChange)}\n />\n <span className=\"checkmark\" style={{ background: color, borderColor: color }} />\n\n {name}\n </label>\n </div>\n );\n }\n}\n\nSeriesToggle.propTypes = {\n singleSeries: CustomPropTypes.SingleSeries.isRequired,\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n\nexport default function Sidebar({ stateController }) {\n const series = useSeries(stateController);\n\n return (\n <div className=\"grapher-sidebar\">\n {\n series.map((singleSeries, i) =>\n <SeriesToggle\n key={i}\n singleSeries={singleSeries}\n stateController={stateController}\n />\n )\n }\n </div>\n );\n}\n\nSidebar.propTypes = {\n stateController: PropTypes.instanceOf(StateController).isRequired\n};\n","export default class SyncPool {\n\n /**\n *\n * @param {Boolean} syncBounds\n * @param {Boolean|'onShift'} syncTooltips\n * @param {Boolean} syncDragState\n */\n constructor({ syncBounds=true, syncTooltips=true, syncDragState=false } = {}) {\n this._stateControllers = new Set();\n this._syncBounds = syncBounds;\n this._syncTooltips = syncTooltips;\n this._syncDragState = syncDragState;\n }\n\n add(stateController) {\n this._stateControllers.add(stateController);\n\n if (this._syncBounds) {\n this.syncBounds(stateController);\n }\n\n if (this._syncTooltips) {\n this.syncTooltips(stateController);\n }\n\n if (this._syncDragState) {\n this.syncDragState(stateController);\n }\n }\n\n remove(stateController) {\n this._stateControllers.delete(stateController);\n\n // TODO: remove listeners\n // (though since this is currently only called by stateController dispose, it probably doesn't matter)\n }\n\n syncDragState(stateController) {\n stateController.on('dragging_y_changed', (draggingY) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (draggingY) {\n otherStateController.markDragStart();\n } else {\n otherStateController.finalizeDrag(null, null);\n }\n }\n });\n }\n\n syncBounds(stateController) {\n stateController.on('bound_calculator_changed', (boundCalculator) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.boundCalculator = boundCalculator;\n }\n });\n }\n\n syncTooltips(stateController) {\n stateController.on('tooltip_state_changed', (tooltipState, stateArg) => {\n if (this._tooltipIgnoreState === stateArg) { // avoid cascading changes\n return;\n }\n\n const shouldHideTooltips = tooltipState.unsavedTooltipsCount === 0 ||\n !tooltipState.mousePresent ||\n (this._syncTooltips === 'onShift' && !stateController.shiftKeyPressedOnMove);\n\n if (shouldHideTooltips) {\n this._tooltipIgnoreState = Math.random();\n }\n\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n if (shouldHideTooltips) {\n otherStateController.showOnlySavedTooltips(this._tooltipIgnoreState);\n continue;\n }\n\n otherStateController.setTooltipMousePosition({\n mouseX: tooltipState.mouseX,\n mouseY: tooltipState.mouseY,\n tooltipAllNext: true,\n tooltipStateArg: this._tooltipIgnoreState\n });\n }\n });\n }\n\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomPropTypes from './helpers/custom_prop_types';\nimport GraphBody from './components/graph_body.jsx';\nimport './grapher.scss';\nimport XAxis from './components/x_axis.jsx';\nimport YAxis from './components/y_axis.jsx';\nimport RangeSelection from './components/range_selection.jsx';\nimport RangeGraph from './components/range_graph.jsx';\nimport SeriesKey from './components/series_key.jsx';\nimport {Y_AXIS_WIDTH} from './helpers/axis_sizes';\nimport GraphTitle from './components/graph_title.jsx';\nimport {LINE_COLORS} from './helpers/colors';\nimport StateController from './state/state_controller';\nimport {useDraggingY, useLeftAxes, useRightAxes, useShowingSidebar, useTheme} from './state/hooks';\nimport Sidebar from './components/sidebar.jsx';\nimport SyncPool from './state/sync_pool.js';\nimport BOUND_CALCULATORS from './state/bound_calculators.js';\n\nfunction calculateClassNamesAndStyles(props, { draggingY, theme }) {\n const { fullscreen, height, width } = props;\n\n const classNames = [\n 'grapher',\n `grapher-${theme}`\n ];\n\n const styles = {};\n\n if (draggingY) {\n classNames.push('grapher-dragging-y');\n }\n\n if (fullscreen) {\n classNames.push('grapher-fullscreen');\n classNames.push('grapher-fixed-height');\n } else if (height) {\n classNames.push('grapher-fixed-height');\n if (typeof height === 'number') {\n styles.height = height - 20;\n } else {\n styles.height = `calc(${height} - 20px)`;\n }\n }\n\n if (width) {\n styles.width = width;\n }\n\n return {\n styles,\n classNames\n };\n}\n\nexport default React.memo(Grapher);\n\nconst grapherDefaultProps = {\n theme: 'night',\n showAxes: true,\n showRangeGraph: true,\n showRangeSelectors: true,\n showSeriesKey: true,\n showTooltips: true,\n boundsSelectionEnabled: true,\n customBoundsSelectors: [],\n sidebarEnabled: false,\n defaultShowAnnotations: true,\n defaultShowOptions: true\n};\n\nfunction Grapher(props) {\n props = {...grapherDefaultProps, ...props};\n\n const stateController = useMemo(() => new StateController({\n grapherID: props.id,\n ...props,\n ...props.stateControllerInitialization\n }), []);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.stateController = stateController;\n }\n\n return () => {\n stateController.dispose();\n };\n }, [stateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(stateController);\n }, [stateController, props.exportStateController]);\n\n useEffect(() => {\n stateController.timingFrameCount = props.timingFrameCount;\n }, [stateController, props.timingFrameCount]);\n\n useEffect(() => {\n props.onRenderTime && stateController.on('render_time', props.onRenderTime);\n\n return () => {\n props.onRenderTime && stateController.off('render_time', props.onRenderTime);\n };\n }, [stateController, props.onRenderTime]);\n\n useEffect(() => {\n stateController.setSeries(props.series);\n }, [stateController, props.series]);\n\n useEffect(() => {\n stateController.theme = props.theme;\n }, [stateController, props.theme]);\n\n const theme = useTheme(stateController);\n const bigLabels = props.bigLabels || theme === 'export';\n\n const defaultLineWidth = props.defaultLineWidth || (theme === 'export' ? 3 : undefined);\n useEffect(() => {\n stateController.defaultLineWidth = defaultLineWidth;\n }, [stateController, defaultLineWidth]);\n\n useEffect(() => {\n stateController.percentile = props.percentile;\n }, [stateController, props.percentile]);\n\n useEffect(() => {\n stateController.customBoundsSelectors = props.customBoundsSelectors;\n }, [stateController, props.customBoundsSelectors]);\n\n useEffect(() => {\n stateController.annotations = props.annotations;\n }, [stateController, props.annotations]);\n\n useEffect(() => {\n if (!props.onAxisChange) {\n return () => {};\n }\n\n stateController.on('exported_axes_changed', props.onAxisChange);\n return () => {\n stateController.off('exported_axes_changed', props.onAxisChange);\n };\n }, [stateController, props.onAxisChange]);\n\n useEffect(() => {\n stateController.primaryRenderer.resize();\n }, [props.height]);\n\n const draggingY = useDraggingY(stateController);\n\n const {styles, classNames} = calculateClassNamesAndStyles(props, { draggingY, theme });\n\n const rightAxes = useRightAxes(stateController);\n const leftAxes = useLeftAxes(stateController);\n const showingSidebar = useShowingSidebar(stateController);\n\n const showAxisColors = typeof props.showAxisColors === 'boolean' ? props.showAxisColors : (theme !== 'export');\n const showGrid = typeof props.showGrid === 'boolean' ? props.showGrid : (theme !== 'export');\n\n const commonYAxisProps = {\n stateController,\n showAxes: props.showAxes,\n showGrid,\n showSeriesKey: props.showSeriesKey,\n bodyHeight: props.bodyHeight,\n theme,\n grapherID: props.id,\n dragPositionYOffset: props.dragPositionYOffset,\n showAxisColors,\n bigLabels\n };\n\n return (\n <div className={classNames.join(' ')} style={styles} data-grapher-id={props.id}>\n {\n props.title &&\n <GraphTitle title={props.title} />\n }\n\n <div className=\"grapher-primary-container-outer\">\n {\n showingSidebar &&\n <Sidebar stateController={stateController} />\n }\n\n <div className=\"grapher-primary-container-body\">\n {\n props.showSeriesKey &&\n <SeriesKey\n stateController={stateController}\n draggingY={draggingY}\n theme={props.theme}\n grapherID={props.id}\n dragPositionYOffset={props.dragPositionYOffset}\n />\n }\n\n {\n props.showRangeSelectors &&\n <RangeSelection\n stateController={stateController}\n customBoundsSelectors={props.customBoundsSelectors}\n customBoundsSelectorsOnly={props.customBoundsSelectorsOnly}\n sidebarEnabled={props.sidebarEnabled}\n />\n }\n\n <div className=\"grapher-main-row\">\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-left\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n\n {\n leftAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={leftAxes.length - i - 1}\n {...commonYAxisProps}\n />;\n })\n }\n\n <div className=\"central-container\">\n <GraphBody\n stateController={stateController}\n webgl={props.webgl}\n bodyHeight={props.bodyHeight}\n boundsSelectionEnabled={props.boundsSelectionEnabled}\n showTooltips={props.showTooltips}\n tooltipOptions={props.tooltipOptions}\n checkIntersection={props.checkIntersection}\n draggablePoints={props.draggablePoints}\n onPointDrag={props.onPointDrag}\n onDraggablePointsDoubleClick={props.onDraggablePointsDoubleClick}\n onPointClick={props.onPointClick}\n verticalLines={props.verticalLines}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n />\n\n <XAxis\n showGrid={showGrid}\n showAxes={props.showAxes}\n stateController={stateController}\n bigLabels={bigLabels}\n xTickUnit={props.xTickUnit}\n clockStyle={props.clockStyle}\n timeZone={props.timeZone}\n integersOnly={props.xAxisIntegersOnly}\n formatXAxisLabel={props.formatXAxisLabel}\n />\n\n {\n props.showRangeGraph &&\n <div className=\"range-graph-container\">\n <RangeGraph\n stateController={stateController}\n webgl={props.webgl}\n checkIntersection={props.checkIntersection}\n markDates={props.markRangeGraphDates}\n timeZone={props.timeZone}\n verticalLines={props.verticalLines}\n />\n </div>\n }\n </div>\n\n {\n rightAxes.map((axis, i) => {\n return <YAxis\n key={i}\n axis={axis}\n sideIndex={i}\n {...commonYAxisProps}\n />;\n })\n }\n\n {\n draggingY &&\n <div\n className=\"axis y-axis\"\n data-axis-index=\"new-right\"\n data-grapher-id={props.id}\n style={{\n width: Y_AXIS_WIDTH,\n height: typeof props.bodyHeight === 'number' ? props.bodyHeight : undefined\n }}\n />\n }\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nGrapher.propTypes = {\n series: CustomPropTypes.Series.isRequired,\n webgl: PropTypes.bool,\n requireWASM: PropTypes.bool,\n checkIntersection: PropTypes.bool,\n\n onAxisChange: PropTypes.func,\n onRenderTime: PropTypes.func,\n exportStateController: PropTypes.func,\n timingFrameCount: PropTypes.number,\n\n stateControllerInitialization: PropTypes.object,\n syncPool: PropTypes.instanceOf(SyncPool),\n id: PropTypes.string,\n dragPositionYOffset: PropTypes.number,\n\n theme: PropTypes.oneOf(['day', 'night', 'export']),\n title: PropTypes.string,\n fullscreen: PropTypes.bool,\n bodyHeight: PropTypes.number,\n height: PropTypes.number,\n width: PropTypes.number,\n\n showAxes: PropTypes.bool,\n showRangeGraph: PropTypes.bool,\n showRangeSelectors: PropTypes.bool,\n showSeriesKey: PropTypes.bool,\n showTooltips: PropTypes.bool,\n showGrid: PropTypes.bool,\n showAxisColors: PropTypes.bool,\n bigLabels: PropTypes.bool,\n xTickUnit: PropTypes.oneOf(['year']),\n formatXAxisLabel: PropTypes.func,\n xAxisIntegersOnly: PropTypes.bool,\n clockStyle: PropTypes.oneOf(['12h', '24h']),\n timeZone: PropTypes.string, // local, utc, or a full timezone string\n markRangeGraphDates: PropTypes.bool,\n\n boundsSelectionEnabled: PropTypes.bool,\n sidebarEnabled: PropTypes.bool,\n\n percentile: PropTypes.number,\n defaultShowOptions: PropTypes.bool,\n defaultShowIndividualPoints: PropTypes.bool,\n defaultShowSidebar: PropTypes.bool,\n defaultShowAnnotations: PropTypes.bool,\n defaultLineWidth: PropTypes.number,\n\n tooltipOptions: CustomPropTypes.TooltipOptions,\n\n customBoundsSelectors: CustomPropTypes.CustomBoundsSelectors,\n customBoundsSelectorsOnly: PropTypes.bool,\n defaultBoundsCalculator: PropTypes.string,\n\n annotations: CustomPropTypes.Annotations,\n draggablePoints: CustomPropTypes.DraggablePoints,\n onPointDrag: PropTypes.func,\n onDraggablePointsDoubleClick: PropTypes.func,\n verticalLines: CustomPropTypes.VerticalLines,\n onPointClick: PropTypes.func\n};\n\nexport const AVAILABLE_COLORS = LINE_COLORS;\nexport const BUILT_IN_BOUND_CALCULATORS = BOUND_CALCULATORS;\n","import Eventable from '../eventable.js';\nimport getColor from '../helpers/colors.js';\nimport nameForSeries from '../helpers/name_for_series.js';\n\nexport default class MultigraphStateController extends Eventable {\n\n constructor({ id }) {\n super();\n\n this._id = id;\n\n this._multiSeries = [];\n this._seriesToGraphIndices = new Map();\n this._graphIndicesToSeries = new Map();\n this._modifiedSeries = new Map();\n this._originalSeriesByMultigrapherIndex = new Map();\n this._stateControllers = new Set();\n this._prevSeries = [];\n\n this._dataCache = new Map();\n this._subscriptions = new Map();\n\n this._draggingY = false;\n\n this.on('multi_series_changed', () => {\n for (let stateController of this._stateControllers) {\n stateController._multiSeries = this._multiSeries;\n }\n });\n }\n\n /**\n * Takes an array of user-supplied series, then splits, modifies, and broadcasts them\n *\n * @param {Array<Object>} series\n */\n setSeries(series) {\n\n if (this._prevSeries.length === series.length) {\n let anyDifferent = false;\n for (let i = 0; i < series.length; i++) {\n if (series[i] !== this._prevSeries[i]) {\n anyDifferent = true;\n break;\n }\n }\n\n if (!anyDifferent) {\n return;\n }\n }\n\n this._prevSeries = series;\n\n const graphIndices = new Set();\n const currentSeriesSet = new Set(series);\n\n for (let singleSeries of series) {\n let graphIndex = singleSeries.graph || 0;\n\n if (this._seriesToGraphIndices.has(singleSeries)) {\n graphIndex = this._seriesToGraphIndices.get(singleSeries);\n }\n\n graphIndices.add(graphIndex);\n\n let seriesSet = this._graphIndicesToSeries.get(graphIndex);\n if (!seriesSet) {\n seriesSet = new Set();\n this._graphIndicesToSeries.set(graphIndex, seriesSet);\n }\n\n seriesSet.add(singleSeries);\n }\n\n const sortedGraphIndices = [...graphIndices].sort();\n\n this._multiSeries = [];\n let globalSeriesIndex = 0;\n\n for (let graphIndex of sortedGraphIndices) {\n const series = [];\n\n for (let singleSeries of this._graphIndicesToSeries.get(graphIndex)) {\n if (!currentSeriesSet.has(singleSeries)) {\n this._graphIndicesToSeries.get(graphIndex).delete(singleSeries);\n continue;\n }\n\n if (this._modifiedSeries.has(singleSeries)) {\n globalSeriesIndex++;\n series.push(this._modifiedSeries.get(singleSeries));\n continue;\n }\n\n const color = getColor(singleSeries.color, globalSeriesIndex);\n const name = nameForSeries(singleSeries, globalSeriesIndex);\n const modifiedSeries = {\n ...singleSeries,\n multigrapherSeriesIndex: globalSeriesIndex,\n multigrapherGraphIndex: graphIndex,\n color,\n name\n };\n\n this._modifiedSeries.set(singleSeries, modifiedSeries);\n this._originalSeriesByMultigrapherIndex.set(globalSeriesIndex, singleSeries);\n\n globalSeriesIndex++;\n series.push(modifiedSeries);\n }\n\n this._multiSeries.push(series);\n }\n\n if (this._nextMultigrapherSeriesIndex) {\n this._nextMultigrapherSeriesIndex = this._nextMultigrapherSeriesIndex - this._multiSeriesCount + globalSeriesIndex;\n } else {\n this._nextMultigrapherSeriesIndex = globalSeriesIndex;\n }\n this._multiSeriesCount = globalSeriesIndex;\n\n this.emit('multi_series_changed', this.multiSeries);\n }\n\n /**\n * Registers a state controller for series switching\n *\n * @param {StateController} stateController\n */\n registerStateController(stateController) {\n if (this._stateControllers.has(stateController)) {\n return;\n }\n\n this._stateControllers.add(stateController);\n stateController._multigraphStateController = this;\n stateController._multiSeries = this._multiSeries;\n\n stateController.on('dragging_y_finalized', ({ grapherID, axisIndex, draggedSeries }={}) => {\n if (grapherID === stateController.grapherID) {\n return;\n }\n\n const [check, multigrapherID, graphIndex] = grapherID.split('-');\n if (check !== 'multigrapher' || multigrapherID !== this._id) {\n return;\n }\n\n setTimeout(() => {\n this.moveSeries({ axisIndex, draggedSeries, graphIndex });\n });\n });\n\n stateController.on('dragging_y_changed', (draggingY) => {\n if (draggingY === this._draggingY) {\n return;\n }\n\n this._draggingY = draggingY;\n this.emit('dragging_y_changed', this._draggingY);\n });\n\n stateController.on('observable_modified', (observable) => {\n for (let otherStateController of this._stateControllers) {\n if (stateController === otherStateController) {\n continue;\n }\n\n otherStateController.markObservableModified(observable);\n }\n });\n\n stateController.on('dispose', () => {\n this._stateControllers.delete(stateController);\n });\n }\n\n /**\n * Moves the given dragged series (as specified by the child state controller) to a different graph\n *\n * @param {String} axisIndex - the axis index on the new graph to move the series to\n * @param {Object} draggedSeries - the series that got dragged. Different identity than what this may access\n * @param {String} graphIndex - the index of the graph to assign it to\n */\n moveSeries({ axisIndex, draggedSeries, graphIndex }) {\n const prevGraphCount = this.graphCount;\n\n const originalSeries = this._originalSeriesByMultigrapherIndex.get(draggedSeries.multigrapherSeriesIndex);\n const modifiedSeries = this._modifiedSeries.get(originalSeries);\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].splice(\n this._multiSeries[modifiedSeries.multigrapherGraphIndex].indexOf(modifiedSeries), 1\n );\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex]];\n\n if (graphIndex === 'top') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtTop();\n } else if (graphIndex === 'bottom') {\n modifiedSeries.multigrapherGraphIndex = this._createGraphAtBottom();\n } else {\n modifiedSeries.multigrapherGraphIndex = parseInt(graphIndex);\n }\n\n modifiedSeries.axisIndex = axisIndex;\n // safe because stateController operates on a copy. We could also have changed the identify of modifiedSeries,\n // but with that we might reset data when moving it back\n delete modifiedSeries.axis;\n\n this._multiSeries[modifiedSeries.multigrapherGraphIndex] = [...this._multiSeries[modifiedSeries.multigrapherGraphIndex], modifiedSeries];\n this._multiSeries = [...this._multiSeries];\n\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n const originalSeriesAtIndex = this._multiSeries[graphIndex].map(({ multigrapherSeriesIndex }) =>\n this._originalSeriesByMultigrapherIndex.get(multigrapherSeriesIndex));\n this._graphIndicesToSeries.set(graphIndex, new Set(originalSeriesAtIndex));\n\n for (let singleSeries of originalSeriesAtIndex) {\n this._seriesToGraphIndices.set(singleSeries, graphIndex);\n }\n }\n\n this.emit('multi_series_changed', this.multiSeries);\n this.emit('graph_count_changed', this.graphCount, prevGraphCount);\n }\n\n /**\n * Finds or creates an empty graph at the beginning and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtTop() {\n // check if there's anything at the beginning already\n let emptyAtTopIndex = null;\n\n for (let i = 0; i < this._multiSeries.length; i++) {\n if (this._multiSeries[i].length === 0) {\n emptyAtTopIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtTopIndex !== null) {\n return emptyAtTopIndex;\n }\n\n // add a series at the beginning and mutate the graph index of each\n this._multiSeries = [[], ...this._multiSeries];\n for (let graphIndex = 0; graphIndex < this._multiSeries.length; graphIndex++) {\n if (!this._multiSeries[graphIndex].length) {\n continue;\n }\n\n this._multiSeries[graphIndex] = [...this._multiSeries[graphIndex]];\n\n for (let modifiedSeries of this._multiSeries[graphIndex]) {\n modifiedSeries.multigrapherGraphIndex = graphIndex;\n }\n }\n\n return 0;\n }\n\n /**\n * Finds or creates an empty graph at the end and returns its index\n *\n * @return {number}\n * @private\n */\n _createGraphAtBottom() {\n // check if there's anything at the beginning already\n let emptyAtBottomIndex = null;\n\n for (let i = this._multiSeries.length - 1; i >= 0; i--) {\n if (this._multiSeries[i].length === 0) {\n emptyAtBottomIndex = i;\n } else {\n break;\n }\n }\n\n if (emptyAtBottomIndex !== null) {\n return emptyAtBottomIndex;\n }\n\n // add something at the bottom\n this._multiSeries = [...this._multiSeries, []];\n\n return this._multiSeries.length - 1;\n }\n\n get multiSeries() {\n return this._multiSeries.filter((series) => series.length);\n }\n\n get series() {\n return [...this._stateControllers].map((stateController) => stateController.series).flat();\n }\n\n get graphCount() {\n return this.multiSeries.length;\n }\n\n get draggingY() {\n return this._draggingY;\n }\n\n dispose() {\n this.clearListeners();\n\n for (let listener of this._subscriptions.values()) {\n listener.unsubscribe();\n }\n\n this._subscriptions.clear();\n }\n\n get stateControllerInitialization() {\n return {\n sharedDataCache: this._dataCache,\n sharedSubscriptions: this._subscriptions\n };\n }\n\n incrementMultigrapherSeriesIndex() {\n const index = this._nextMultigrapherSeriesIndex;\n\n this._nextMultigrapherSeriesIndex ++;\n\n return index;\n }\n}\n","import React, { useEffect, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport Grapher from './grapher.jsx';\nimport MultigraphStateController from './state/multigraph_state_controller.js';\nimport {useDraggingY, useMultiSeries} from './state/hooks.js';\nimport SyncPool from './state/sync_pool.js';\n\nexport default React.memo(MultiGrapher);\n\n\nfunction MultiGrapher(props) {\n /* eslint-disable react/prop-types */\n\n const multigrapherID = useMemo(() => Math.random().toString(36).slice(2), []);\n\n const multigraphStateController = useMemo(() => new MultigraphStateController({\n id: multigrapherID,\n ...props\n }), []);\n\n const multiSeries = useMultiSeries(multigraphStateController);\n\n const syncPool = useMemo(() => new SyncPool({\n syncBounds: props.syncBounds,\n syncTooltips: props.syncTooltips,\n syncDragState: true\n }), []);\n\n const registerStateController = useMemo(() => multigraphStateController.registerStateController.bind(multigraphStateController), [multigraphStateController]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n window.multigraphStateController = multigraphStateController;\n }\n\n return () => {\n multigraphStateController.dispose();\n };\n }, [multigraphStateController]);\n\n useEffect(() => {\n props.exportStateController && props.exportStateController(multigraphStateController);\n }, [multigraphStateController, props.exportStateController]);\n\n useEffect(() => {\n multigraphStateController.setSeries(props.series);\n }, [multigraphStateController, props.series]);\n\n useEffect(() => {\n if (!props.onMultiseriesChange) {\n return () => {};\n }\n\n multigraphStateController.on('multi_series_changed', props.onMultiseriesChange);\n return () => {\n multigraphStateController.off('multi_series_changed', props.onMultiseriesChange);\n };\n }, [multigraphStateController, props.onMultiseriesChange]);\n\n const draggingY = useDraggingY(multigraphStateController);\n\n return (\n <div className=\"multigrapher\">\n {\n draggingY && props.newUpperEnabled &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-top`}>\n New grapher\n </div>\n }\n\n {\n multiSeries.map((series, i) =>\n <Grapher\n key={i}\n {...props}\n syncPool={syncPool}\n stateControllerInitialization={multigraphStateController.stateControllerInitialization}\n series={series}\n id={`multigrapher-${multigrapherID}-${i}`}\n dragPositionYOffset={props.newUpperEnabled ? 38 : 0}\n exportStateController={registerStateController}\n />\n )\n }\n\n {\n draggingY &&\n <div className={`new-grapher grapher-${props.theme}`} data-grapher-id={`multigrapher-${multigrapherID}-bottom`}>\n New grapher\n </div>\n }\n </div>\n );\n}\n\nMultiGrapher.defaultProps = {\n theme: 'night'\n};\n\nMultiGrapher.propTypes = Object.assign({}, Grapher.propTypes, {\n syncBounds: PropTypes.bool,\n syncTooltips: PropTypes.bool,\n newUpperEnabled: PropTypes.bool,\n onMultiseriesChange: PropTypes.func\n});\n"],"names":["inProgress","dataWebpackPrefix","___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","f","chunkId","Promise","all","keys","reduce","promises","u","prop","prototype","hasOwnProperty","call","l","url","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","forEach","fn","setTimeout","bind","type","r","Symbol","toStringTag","value","p","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","globalThis","require","SIMPLE_DATA_TYPES","DATA_TYPES","Data","SingleSeries","xKey","yKey","xUnixDates","color","xLabel","yLabel","ignoreDiscontinuities","dashed","dashPattern","width","rangeSelectorWidth","axis","expandYWith","defaultAlwaysTooltipped","square","shiftXBy","graph","background","hideFromKey","showIndividualPoints","rendering","negativeColor","gradient","zeroLineWidth","zeroLineColor","zeroLineY","pointRadius","tooltipWidth","hasAreaBottom","shadowColor","rangeKey","Series","Axis","axisIndex","series","side","scale","label","Axes","CustomBoundsSelector","calculator","datesOnly","CustomBoundsSelectors","TooltipOptionsRaw","includeSeriesLabel","includeXLabel","includeYLabel","includeXValue","includeYValue","floating","alwaysFixedPosition","floatPosition","floatDelta","savingDisabled","customTooltip","combineTooltips","TooltipOptions","Annotation","x","Date","startX","endX","lineOnly","Annotations","DraggablePoint","y","radius","fillColor","strokeColor","strokeWidth","onClick","onDoubleClick","DraggablePoints","VerticalLine","lineTop","markTop","markerStyle","text","textTop","textStyle","minPixelX","maxPixelX","onRangeGraph","onRangeGraphOnly","VerticalLines","async","sizeCanvas","canvas","context","reset","height","requestAnimationFrame","boundingRect","getBoundingClientRect","pixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","elementWidth","elementHeight","renderWidth","renderHeight","LINE_COLORS","getColor","seriesColor","multigrapherSeriesIndex","colorToVector","startsWith","parts","split","part","parseFloat","match","test","parseInt","substr","pathsFrom","dataInRenderSpace","splitAtY","paths","currentPath","previouslyDiscontinuous","nullMask","maxYValues","minYValues","yValues","minY","maxY","prevY","rustApiModule","RustAPIPromise","then","default","RustAPI","extractVerticesFromPaths","pointNumber","path","positions","Float32Array","prevPositions","vertices","indices","Uint32Array","verticesPattern","set","vertexPointer","sourceLength","copyWithin","pointI","prevX","createGLProgram","gl","vertShaderSource","fragShaderSource","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","console","getShaderInfoLog","fragmentShader","FRAGMENT_SHADER","program","createProgram","attachShader","linkProgram","validateProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","LineProgram","constructor","_gl","_program","lineVert","lineFrag","_circleProgram","circleVert","circleFrag","_positionBuffer","createBuffer","_prevPositionBuffer","_vertexBuffer","_indexBuffer","_individualPointBuffer","getExtension","dispose","clear","drawingBufferWidth","drawingBufferHeight","clearColor","DEPTH_BUFFER_BIT","COLOR_BUFFER_BIT","viewport","draw","parameters","useProgram","thickness","highlighted","shadowBlur","get_point_number","extract_vertices","extractVertices","positionIndex","getAttribLocation","prevPositionIndex","vertexIndex","enableVertexAttribArray","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","vertexAttribPointer","FLOAT","uniform1f","getUniformLocation","Math","max","uniform4f","ELEMENT_ARRAY_BUFFER","drawElements","TRIANGLES","UNSIGNED_INT","individualPoints","getIndividualPoints","flat","drawArrays","POINTS","Eventable","_listeners","clearListeners","on","eventName","Set","add","off","delete","size","emit","args","arguments","BackgroundProgram","backgroundVert","backgroundFrag","minXt","maxXt","positionLocation","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","drawZeroLine","sizing","zeroColor","zeroWidth","strokeStyle","lineWidth","beginPath","moveTo","lineTo","stroke","getBarWidths","closestSpacing","bounds","axisSeriesCount","fullBarWidth","maxX","minX","totalBarWidth","barWidth","barSpacing","inferType","useSimpleData","simpleData","Array","isArray","observe","GraphBodyRenderer","stateController","canvasElement","webgl","checkIntersection","super","_stateController","_checkIntersection","_canvas","_webgl","_context","getContext","_lineProgram","alert","_context2d","_initialized","_initializeCanvas","_boundResize","resize","_cachedAxisCount","_onAxisChange","axes","filter","_resizeObserver","disconnect","_intersectionObserver","clearRect","render","singleSeries","inRenderSpace","defaultLineWidth","globalBounds","inRenderSpaceAreaBottom","useDataSpace","currentBounds","inSelectedSpace","inDataSpace","_sizing","commonCPUParams","flush","zero","hasNegatives","find","tuple","indexInAxis","fillStyle","barBottom","fillRect","drawBars","indexOf","globalGradient","createLinearGradient","addColorStop","areaBottom","areaPaths","areaBottomPaths","linePaths","pathI","areaBottomPath","firstX","_startY","lastX","_lastY","fill","positive","arc","PI","drawArea","drawParams","getRanges","range","min","pixelX","pixelMinY","pixelMaxY","setLineDash","ranges","horizontalBarWidth","drawLine","renderBackground","inBackgroundSpace","_backgroundProgram","drawBackground","markSizeChanged","ResizeObserver","first","disabled","IntersectionObserver","entries","_intersectionTimeout","isIntersecting","threshold","sizingPromise","resizeDebounced","_resizeTimeout","recalculatePosition","calculatePrecision","log10","abs","roundToPrecision","precision","isNaN","rounded","toFixed","ceil","stripped","includes","replace","DATE_TIME_FORMATTERS","timezoneToOffsetMS","timeZone","sampleDate","datetimeFormatter","properTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZoneName","offsetPart","formatToParts","hours","minutes","slice","startOfDayInTimezone","date","timezone","startOfDay","setHours","offset","setUTCHours","valueOf","formatX","dates","justTime","justDate","justMonthAndDay","clockStyle","unitOverride","integersOnly","inverseEnumMap","time","utc","toLowerCase","localOffset","year","getUTCFullYear","getFullYear","month","getUTCMonth","getMonth","day","getUTCDate","getDate","toLocaleDateString","getUTCHours","getHours","getUTCMinutes","getMinutes","seconds","getUTCSeconds","getSeconds","milliseconds","getUTCMilliseconds","getMilliseconds","timeString","padStart","formatTime","round","formatY","log","Y_AXIS_WIDTH","getYLabelContent","fullYPrecision","TooltipLabel","axisLabel","textLeft","formatXOptions","React","propTypes","CustomPropTypes","Tooltip","halfHeight","passThroughProps","preparedTooltips","tooltips","tooltip","pixelY","fixedPosition","multiplier","caretSize","isFinite","transform","commonLabelProps","maxPrecision","baseLeft","yTranslation","axisCount","caretPadding","Boolean","CustomTooltipComponent","groupedTooltips","combinationThreshold","added","group","totalHeight","maxWidth","sort","b","className","_extends","top","left","defaultProps","mouseX","mouseY","ContextMenu","setTextRef","ref","textRef","contextMenu","showing","createRange","selection","getSelection","removeAllRanges","selectNodeContents","addRange","focus","formatDateTime","dateTimeStr","datePart","timePart","formattedDate","period","toLocaleString","displayValue","autoFocus","simpleSeriesToDataSpace","tuples","tuplesToDataSpace","values","valuesToDataSpace","objects","objectsToDataSpace","originalXValue","enumToNumber","yValue","valueXStart","xValue","readBinaryFormatValue","view","getUint32","BYTES_PER_ELEMENT","getUint8","getFloat64","point","buffer","ArrayBuffer","DataView","xIndex","channels","yIndex","offsets","subpoint","finalizeBounds","initial","calculateDataBounds","percentile","percentileAsymmetry","sortedByY","_x","_x1","y1","_x2","y2","asymmetry","inBottomPercentile","inTopPercentile","startIndex","floor","endIndex","percentileBounds","spacing","mergeBounds","boundsList","mergedBounds","expandBounds","extendXForNBars","expandedBounds","assign","unscaledMinY","unscaledMaxY","midpoint","binarySearch","targetX","searchParams","returnIndex","middleIndex","searchType","dataSpaceToSelectedSpace","swap","firstAdded","lastAdded","beforeIndex","afterIndex","addToEndOnly","beginningInterpolationIndex","endInterpolationIndex","pop","shift","unshift","interpolationIndex","interpolate","lastIncluded","nullIndex","selectedIndex","dataIndex","begPoint","endPoint","firstIndex","secondIndex","boundary","xBefore","yBefore","xAfter","yAfter","percent","scaleBounds","selectedSpaceToRenderSpace","dataChanged","Uint8Array","Float64Array","scaledBounds","inParams","dataF64","dataNullMask","copyIndexStart","hasSwap","useSwap","extraSpaceFactor","selected_space_to_render_space","prevI","minSeenY","maxSeenY","curY","selectedSpaceToRenderSpaceInPlace","flattenSimpleData","flattened","fI","extractYValue","warn","extractXValue","moveTooltip","distance","sqrt","xDistance","pixelWidth","lastMinute","last10Minutes","lastHour","lastDay","condenseDataSpace","targetBucketCount","partiallyCondensedData","CONDENSE_THRESHOLD","condensedData","bucketSize","minInBucket","maxInBucket","currentBucketIndex","bucketIndex","nameForSeries","selectedSpaceToBackgroundSpace","conditions","evaluator","comparator","comparedAgainst","parsedValue","currentSection","condition","interpolatedMaxX","interpolatedMinX","StateController","defaultBoundsCalculator","customBoundsSelectors","requireWASM","defaultShowIndividualPoints","defaultShowSidebar","defaultShowAnnotations","defaultShowOptions","syncPool","grapherID","sharedDataCache","sharedSubscriptions","fullscreen","_requireWASM","_markDirty","_series","_seriesFromOriginalSeries","Map","_axes","_highlightedSeries","_showIndividualPoints","_autoscaleY","_percentile","_percentileAsymmetry","_showingOptions","_maxPrecision","_showingSidebar","_showingAnnotations","_grapherID","_fullscreen","_alwaysTooltipped","_tooltipState","mousePresent","_contextMenuPosition","_savedTooltips","_draggingY","_annotations","_annotationsState","annotations","_enumMap","_hasXEnum","_timingBuffer","_timingIndex","_timingFrameCount","_modifiedSeries","_deferredEmissions","_deferredPriorityEmissions","primaryRenderer","rangeGraphRenderer","_boundsCalculator","givenLabel","customCalculators","BOUND_CALCULATORS","getDefaultBoundsCalculator","_boundsHistory","_boundsIndex","_dataCache","_subscriptions","_subscriptionsShared","_observablesToSeries","_generators","_generatorsToSeries","_generatorCallArgs","_seriesChangedFromPromises","_syncPool","_onDataChange","listener","unsubscribe","_removeSeries","disposed","setSeries","userSeries","userCreated","propsSeries","anyDifferent","originalSeries","_mustResize","newSeriesSet","has","_tooltipsChanged","deferredEmit","_assignAxisTo","hidden","_hideSeries","_dataChanged","_frameRequested","frameRequestStart","performance","now","frameExecutionStart","dataProcessingStart","_mustRerender","_annotationsChanged","_onDataAdd","_primarySizeChanged","_calculatePrimarySizeDependents","_rangeGraphSizeChanged","_calculateRangeGraphSizeDependents","dataProcessingEnd","renderPipelineStart","_render","renderPipelineEnd","generatorsStart","_mustCallGenerators","_callGenerators","generatorsEnd","tooltipStart","_recalculateTooltips","tooltipEnd","contextMenuStart","_contextMenuChanged","_recalculateContextMenu","contextMenuEnd","annotationStart","_recalculateAnnotations","annotationEnd","callbacksStart","emission","callbacksEnd","completionTime","loopTime","frameExecution","frameRequestAndExecution","generators","dataProcessing","renderPipeline","callbacks","lastLoopTime","deferredPriorityEmit","_seriesToSimpleData","currentData","sameDataSet","firstSameDataSeries","next","_listenToObservableData","observable","_callGenerator","_listenToPromise","dataPromise","resolved","datum","markObservableModified","_unsubscribeFromStaleSeries","currentSeries","seriesSet","stillHasListener","generator","stillHasSeries","_selection","alwaysTooltipped","savedTooltips","allTooltipped","savedTooltip","minDistance","Infinity","trueX","closestIndex","closestPoint","ignoreYDistance","xDistanceThreshold","yDistanceThreshold","distanceThreshold","yDistance","enumLike","hasEnum","simplePoint","hasXEnum","unsavedTooltips","unsavedTooltipsCount","calculateTooltipState","_tooltipAllNext","_globalBounds","_tooltipStateArg","newX","right","shownSeries","xRange","annotation","seriesName","isRange","isPoint","xStartValue","xEndValue","convertToNumber","val","pixelStartX","pixelEndX","calculateAnnotationsState","_expandYWith","dataBoundsList","simpleDataSliceStart","dataBounds","_dataBounds","_recalculateSelection","disableSwap","selectedBounds","selectedBoundsAreaTop","selectedBoundsAreaBottom","inSelectedSpaceAreaBottom","_recalculateAxisBounds","modifiedSeries","newData","modifiedAxes","modifiedSeriesAndDependents","newDataInDataSpace","newDataBounds","newPointCount","previousSelection","newSelectedData","fixedY","targetBounds","byAxis","selectedBoundsList","selectedDataBounds","boundsCalculator","selectionFromGlobalBounds","_","export","night","_theme","inBackgroundSpacePrimary","inRenderSpacePrimary","_defaultLineWidth","inRenderSpacePrimaryAreaBottom","inRenderSpaceRangeGraph","inRenderSpaceRangeGraphAreaBottom","toCondensedSelectedSpaceParams","inCondensedSelectedSpacePrimary","toRenderSpaceParams","inCondensedSelectedSpacePrimaryAreaBottom","inBackgroundSpacePrimaryAreaBottom","toSelectedSpaceParams","inSelectedSpaceRangeGraph","inCondensedSelectedSpaceRangeGraph","inSelectedSpaceRangeGraphAreaBottom","inCondensedSelectedSpaceRangeGraphAreaBottom","_createAxis","_moveAxis","newAxis","oldAxis","oldIndex","leftAxes","rightAxes","exportedAxes","originalAxis","seen","candidateAxis","findMatchingAxis","inValueSpacePrimary","inValueSpaceRangeGraph","_showSeries","boundCalculator","reverse","highlightedSeries","autoscaleY","boundHistory","hasNextBounds","hasPreviousBounds","tooltipState","contextMenuState","draggingY","averageLoopTime","loopTimes","averageLoopTimes","axisToName","leftCount","rightCount","showingOptions","showingSidebar","showingAnnotations","userCreatedSeries","annotationState","theme","exportMode","_exportMode","enumMap","renderer","_nonExportTheme","boundingFunction","debounceHistory","_boundingCalculatorDebouncer","_addBoundCalculatorToHistory","boundsSelectors","_customBoundsSelectors","indexedCustomBoundSelectors","registerSeriesClick","selectedSeriesIndex","setHighlightedSeries","toggleIndividualPoints","toggleYAutoscaling","toggleExportMode","setBoundsFromSelection","pixelSelection","minPixelY","maxPixelY","pow","boundCalculatorFromSelection","nextBounds","previousBounds","setLabel","toggleScale","oldScale","recalculateTooltips","setTooltipMousePosition","clientX","_tooltipClientX","clientY","_tooltipClientY","shiftKey","shiftKeyPressedOnMove","tooltipAllNext","tooltipStateArg","showOnlySavedTooltips","bottom","newMouseX","newMouseY","setContextMenuMousePosition","toggleAlwaysTooltipped","registerClick","toggleTooltipSaved","oldSavedTooltips","currentTooltips","lastTooltip","currentTooltipIndex","findIndex","clearSavedTooltips","markDragStart","finalizeDrag","draggedSeries","hasAxis","sameGrapherID","timingFrameCount","toggleShowingOptions","toggleMaxPrecision","toggleShowingAnnotations","toggleShowingSidebar","setShowing","skipResize","isX","existingIndex","indexToSet","triggerResize","useEvent","eventSource","initialState","watch","originalInitialState","setValue","useState","useEffect","updatedValue","originalUpdatedValue","usePrimarySize","useAxes","useSeries","useHighlightedSeries","useRightAxisCount","useRightAxes","useLeftAxisCount","useLeftAxes","useAxisBounds","useAutoscaleY","useDraggingY","useShowingOptions","useMaxPrecision","useShowingSidebar","useShowingAnnotations","useSizing","useTheme","bodyHeight","validAnnotations","annotationStyle","pointMarkerWidth","position","approxTextWidth","textAlign","draggablePoints","onPointDrag","onDraggablePointsDoubleClick","onPointlessDoubleClick","newXT","newYT","xT","yT","stopPropagation","cx","cy","onMouseDown","xOffset","yOffset","onMouseMove","moveEvent","onMouseUp","removeEventListener","addEventListener","verticalLines","isRangeGraph","relevantVerticalLines","line","lineStyle","fontSize","textAnchor","dominantBaseline","x1","x2","points","GraphBody","boundsSelectionEnabled","showTooltips","tooltipOptions","onPointClick","canvasEl","useCallback","el","boundsSelection","setBoundsSelection","start","useTooltipState","showAnnotations","useAnnotationState","useContextMenu","onScroll","onGlobalMouseMove","passive","onMouseLeave","currentNode","classList","contains","closest","seriesToNearestPoint","onContextMenu","preventDefault","placeTick","trueValue","inverted","totalSize","formatter","formatOptions","opts","scaledValue","pixelValue","placeTickByPixel","roundToDivisor","divisor","divisors","bestDelta","bestDivisor","delta","placeGrid","expectedLabelSize","labelPadding","skipFirst","skipLast","paddedLabelSize","ticks","placementParams","amount","unit","span","desiredCount","subspan","getEvenDateTickSpacing","currentDate","setMinutes","setSeconds","setMilliseconds","setDate","lastDateString","tick","placeDatesGrid","tickSpacing","roundTo","getEvenTickSpacing","roundToEvenNumber","placeNumbersGrid","locals","XAxis","showAxes","showGrid","bigLabels","xTickUnit","formatXAxisLabel","useSelection","useHasXEnum","useEnumMap","minDate","maxDate","calculateTimePrecision","minLabel","maxLabel","expectedLabelWidth","marginBottom","skipGrid","classes","xAxisHeight","YAxis","showSeriesKey","sideIndex","dragPositionYOffset","showAxisColors","sidePadding","setDraggedSeries","dragDelta","setDragDelta","dx","dy","highlightedOpacity","unhighlightedOpacity","marginLeft","opacity","edge","strokeDasharray","startDrag","startY","mouseUpEvent","dataset","grapherId","onMouseOver","onMouseOut","RangeSelectionButtonBase","selected","children","description","RangeSelectionButton","currentBoundCalculator","PercentileButton","usePercentile","usePercentileAsymmetry","onChange","onKeyUp","keyCode","focusable","viewBox","Options","sidebarEnabled","useShowIndividualPoints","RangeSelection","customBoundsSelectorsOnly","rightAxisCount","leftAxisCount","marginRight","useGlobalBounds","useBoundCalculator","useBoundHistory","customBoundSelectorNames","RangeGraph","state","selectionBounds","stopDragging","startScroll","startLeftDrag","startRightDrag","componentDidMount","_renderer","setState","componentDidUpdate","prevProps","componentWillUnmount","_dragType","leftX","percentage","_scrollAnchorPercentage","boundToRight","boundToLeft","addListeners","pixelMinX","pixelMaxX","markDates","SeriesKeyItem","backgroundColor","SeriesKeyAxisContainer","showingLabelInput","toggleLabelInputShowing","placeholder","SeriesKey","dragPosition","setDragPosition","keyRef","useRef","keyWidth","setKeyWidth","sizeCalculationHandle","current","cancelAnimationFrame","querySelectorAll","clientWidth","calculateStyles","useAlwaysTooltipped","toggleTooltipped","startDragging","seriesKeyEl","targetLeft","seriesKeyLeft","seriesKeyMarginLeft","clientStartX","clientStartY","pointerEvents","zIndex","GraphTitle","title","SeriesToggle","checked","defaultChecked","borderColor","Sidebar","SyncPool","syncBounds","syncTooltips","syncDragState","_stateControllers","_syncBounds","_syncTooltips","_syncDragState","otherStateController","stateArg","_tooltipIgnoreState","shouldHideTooltips","random","Grapher","grapherDefaultProps","showRangeGraph","showRangeSelectors","useMemo","stateControllerInitialization","exportStateController","onRenderTime","onAxisChange","styles","classNames","calculateClassNamesAndStyles","commonYAxisProps","xAxisIntegersOnly","markRangeGraphDates","AVAILABLE_COLORS","BUILT_IN_BOUND_CALCULATORS","MultigraphStateController","_id","_multiSeries","_seriesToGraphIndices","_graphIndicesToSeries","_originalSeriesByMultigrapherIndex","_prevSeries","graphIndices","currentSeriesSet","graphIndex","sortedGraphIndices","globalSeriesIndex","multigrapherGraphIndex","_nextMultigrapherSeriesIndex","_multiSeriesCount","multiSeries","registerStateController","_multigraphStateController","check","multigrapherID","moveSeries","prevGraphCount","graphCount","_createGraphAtTop","_createGraphAtBottom","originalSeriesAtIndex","emptyAtTopIndex","emptyAtBottomIndex","incrementMultigrapherSeriesIndex","MultiGrapher","multigraphStateController","useMultiSeries","onMultiseriesChange","newUpperEnabled"],"sourceRoot":""}