From 7c3b5b65ec9bb08c61435b25ffd7d2d3c67eea9b Mon Sep 17 00:00:00 2001 From: bcliang Date: Sun, 25 Aug 2019 15:09:13 -0700 Subject: [PATCH 1/7] sync w/ changes in plotly/dash-core-components PR#604 --- src/lib/components/ExtendableGraph.react.js | 86 ++++++++++----------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/lib/components/ExtendableGraph.react.js b/src/lib/components/ExtendableGraph.react.js index b0c3c6e..918ad95 100644 --- a/src/lib/components/ExtendableGraph.react.js +++ b/src/lib/components/ExtendableGraph.react.js @@ -64,67 +64,67 @@ const filterEventData = (gd, eventData, event) => { return filteredEventData; }; -function generateId() { - const charAmount = 36; - const length = 7; - return ( - 'graph-' + - Math.random() - .toString(charAmount) - .substring(2, length) - ); -} - /** * ExtendableGraph can be used to render any plotly.js-powered data vis. * * You can define callbacks based on user interaction with ExtendableGraphs such * as hovering, clicking or selecting */ -const ExtendableGraphWithDefaults = props => { - const id = props.id ? props.id : generateId(); - return ; -}; - class ExtendableGraph extends Component { constructor(props) { super(props); + this.gd = React.createRef(); this.bindEvents = this.bindEvents.bind(this); this._hasPlotted = false; + this._prevGd = null; this.graphResize = this.graphResize.bind(this); } plot(props) { - const {figure, id, animate, animation_options, config} = props; - const gd = document.getElementById(id); + const {figure, animate, animation_options, config} = props; + const gd = this.gd.current; if ( animate && this._hasPlotted && figure.data.length === gd.data.length ) { - return Plotly.animate(id, figure, animation_options); + return Plotly.animate(gd, figure, animation_options); } - return Plotly.react(id, { + return Plotly.react(gd, { data: figure.data, layout: clone(figure.layout), frames: figure.frames, config: config, }).then(() => { - if (!this._hasPlotted) { - const gd = document.getElementById(id); - if (gd) { - this.bindEvents(); - Plotly.Plots.resize(gd); - this._hasPlotted = true; + const gd = this.gd.current; + + // double-check gd hasn't been unmounted + if (!gd) { + return; + } + + // in case we've made a new DOM element, transfer events + if (this._hasPlotted && gd !== this._prevGd) { + if (this._prevGd && this._prevGd.removeAllListeners) { + this._prevGd.removeAllListeners(); + Plotly.purge(this._prevGd); } + this._hasPlotted = false; + } + + if (!this._hasPlotted) { + this.bindEvents(); + Plotly.Plots.resize(gd); + this._hasPlotted = true; + this._prevGd = gd; } }); } extend(props) { - const {id, extendData} = props; - const gd = document.getElementById(id); + const {extendData} = props; + const gd = this.gd.current; let updateData, traceIndices, maxPoints; if (extendData) { @@ -158,24 +158,24 @@ class ExtendableGraph extends Component { if (i < updateData.length - 1) { if (traceIndices[i] < gd.data.length) { Plotly.extendTraces( - id, + gd, updateObject, [traceIndices[i]], maxPoints ); } else { - Plotly.addTraces(id, value); + Plotly.addTraces(gd, value); } } else { if (traceIndices[i] < gd.data.length) { return Plotly.extendTraces( - id, + gd, updateObject, [traceIndices[i]], maxPoints ); } - return Plotly.addTraces(id, value); + return Plotly.addTraces(gd, value); } } } @@ -184,16 +184,16 @@ class ExtendableGraph extends Component { } graphResize() { - const graphDiv = document.getElementById(this.props.id); - if (graphDiv) { - Plotly.Plots.resize(graphDiv); + const gd = this.gd.current; + if (gd) { + Plotly.Plots.resize(gd); } } bindEvents() { - const {id, setProps, clear_on_unhover} = this.props; + const {setProps, clear_on_unhover} = this.props; - const gd = document.getElementById(id); + const gd = this.gd.current; gd.on('plotly_click', eventData => { const clickData = filterEventData(gd, eventData, 'click'); @@ -249,8 +249,10 @@ class ExtendableGraph extends Component { } componentWillUnmount() { - if (this.eventEmitter) { - this.eventEmitter.removeAllListeners(); + const gd = this.gd.current; + if (gd && gd.removeAllListeners) { + gd.removeAllListeners(); + Plotly.purge(gd); } window.removeEventListener('resize', this.graphResize); } @@ -297,6 +299,7 @@ class ExtendableGraph extends Component {
Date: Sun, 25 Aug 2019 15:32:18 -0700 Subject: [PATCH 2/7] package.json cleanup --- README.md | 2 +- package.json | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 11e3d83..7f880db 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/dash-extendable-graph.svg) [![PyPI - License](https://img.shields.io/pypi/l/dash-extendable-graph.svg)](./LICENSE) -dash-extendable-graph is a Dash component library. This library contains a single component: `ExtendableGraph`. The component is a fork of the Graph() component of [dash-core-components](https://github.com/plotly/dash-core-components) (v 1.0.0). However, the `extendData` for this component has been modified to follow an api that matches the format of `figure['data']` (as opposed to the api defined `Graph.extendData` and `Plotly.extendTraces()`). +dash-extendable-graph is a Dash component library. This library contains a single component: `ExtendableGraph`. The component is a fork of the Graph() component of [dash-core-components](https://github.com/plotly/dash-core-components) (v 1.1.1). However, the `extendData` for this component has been modified to follow an api that matches the format of `figure['data']` (as opposed to the api defined `Graph.extendData` and `Plotly.extendTraces()`). Note: plotly.js is required. However, the library is NOT explicitly listed in `MANIFEST.in` or in `dash_extendable_graph\__init__.py` as a way to reduce bundle size. Plotly.js is already distributed with the dash-core-components package, and most projects will import dcc as well as dash-extendable-graph. diff --git a/package.json b/package.json index ef6b57c..ef12f1d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dash_extendable_graph", - "version": "1.0.2", + "version": "1.0.3", "description": "plotly-dash custom component. Adds Plotly.extendTraces() support to dash_core_components.Graph()", "homepage": "https://github.com/bcliang/dash-extendable-graph", "main": "build/index.js", @@ -35,7 +35,6 @@ "babel-eslint": "^10.0.2", "babel-loader": "^8.0.6", "component-playground": "^3.0.0", - "copyfiles": "^2.1.1", "css-loader": "^1.0.1", "eslint": "^5.16.0", "eslint-config-prettier": "^3.6.0", @@ -45,7 +44,6 @@ "prettier": "^1.16.4", "prop-types": "^15.7.2", "react": "^16.8.6", - "react-docgen": "^4.1.1", "react-dom": "^16.8.6", "style-loader": "^0.23.1", "styled-jsx": "^3.1.1", From cdfd916e09d8b926f7f3436127cc30f3f7aaea7f Mon Sep 17 00:00:00 2001 From: bcliang Date: Sun, 25 Aug 2019 15:34:21 -0700 Subject: [PATCH 3/7] fix docstrings, use ramda equals in component bindEvents() --- src/lib/components/ExtendableGraph.react.js | 51 ++++++++++++--------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/lib/components/ExtendableGraph.react.js b/src/lib/components/ExtendableGraph.react.js index 918ad95..89298c6 100644 --- a/src/lib/components/ExtendableGraph.react.js +++ b/src/lib/components/ExtendableGraph.react.js @@ -1,6 +1,6 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; -import {contains, filter, clone, has, isNil, type, omit} from 'ramda'; +import {contains, filter, clone, has, isNil, type, omit, equals} from 'ramda'; /* global Plotly:true */ const filterEventData = (gd, eventData, event) => { @@ -191,7 +191,14 @@ class ExtendableGraph extends Component { } bindEvents() { - const {setProps, clear_on_unhover} = this.props; + const { + setProps, + clear_on_unhover, + relayoutData, + restyleData, + hoverData, + selectedData, + } = this.props; const gd = this.gd.current; @@ -209,30 +216,30 @@ class ExtendableGraph extends Component { setProps({clickAnnotationData}); }); gd.on('plotly_hover', eventData => { - const hoverData = filterEventData(gd, eventData, 'hover'); - if (!isNil(hoverData)) { - setProps({hoverData}); + const hover = filterEventData(gd, eventData, 'hover'); + if (!isNil(hover) && !equals(hover, hoverData)) { + setProps({hoverData: hover}); } }); gd.on('plotly_selected', eventData => { - const selectedData = filterEventData(gd, eventData, 'selected'); - if (!isNil(selectedData)) { - setProps({selectedData}); + const selected = filterEventData(gd, eventData, 'selected'); + if (!isNil(selected) && !equals(selected, selectedData)) { + setProps({selectedData: selected}); } }); gd.on('plotly_deselect', () => { setProps({selectedData: null}); }); gd.on('plotly_relayout', eventData => { - const relayoutData = filterEventData(gd, eventData, 'relayout'); - if (!isNil(relayoutData)) { - setProps({relayoutData}); + const relayout = filterEventData(gd, eventData, 'relayout'); + if (!isNil(relayout) && !equals(relayout, relayoutData)) { + setProps({relayoutData: relayout}); } }); gd.on('plotly_restyle', eventData => { - const restyleData = filterEventData(gd, eventData, 'restyle'); - if (!isNil(restyleData)) { - setProps({restyleData}); + const restyle = filterEventData(gd, eventData, 'restyle'); + if (!isNil(restyle) && !equals(restyle, restyleData)) { + setProps({restyleData: restyle}); } }); gd.on('plotly_unhover', () => { @@ -274,7 +281,7 @@ class ExtendableGraph extends Component { return; } - const figureChanged = this.props.figure !== nextProps.figure; + const figureChanged = !equals(this.props.figure, nextProps.figure); if (figureChanged) { this.plot(nextProps); } @@ -437,7 +444,7 @@ const graphPropTypes = { */ edits: PropTypes.exact({ /** - * annotationPosition: the main anchor of the annotation, which is the + * The main anchor of the annotation, which is the * text (if no arrow) or the arrow (which drags the whole thing leaving * the arrow length & direction unchanged) */ @@ -559,12 +566,12 @@ const graphPropTypes = { * Remove mode bar button by name. * All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js * Common names include: - * - sendDataToCloud - * - (2D): zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d - * - (Cartesian): hoverClosestCartesian, hoverCompareCartesian - * - (3D): zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d - * - (Geo): zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo - * - hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews + * sendDataToCloud; + * (2D) zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d; + * (Cartesian) hoverClosestCartesian, hoverCompareCartesian; + * (3D) zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d; + * (Geo) zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo; + * hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews. */ modeBarButtonsToRemove: PropTypes.array, From c977dda548ef9c90b4c382f82107d90a8d3a242a Mon Sep 17 00:00:00 2001 From: bcliang Date: Tue, 27 Aug 2019 09:17:38 -0700 Subject: [PATCH 4/7] fix eslint-utils vuln --- package-lock.json | 563 ++++++++++++++++++---------------------------- package.json | 13 +- 2 files changed, 229 insertions(+), 347 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65c0d94..6eeb854 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "dash_extendable_graph", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1500,15 +1500,15 @@ } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", "dev": true }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", "dev": true }, "ajv": { @@ -1808,17 +1808,28 @@ } }, "babel-eslint": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz", - "integrity": "sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } } }, "babel-loader": { @@ -2271,9 +2282,9 @@ "dev": true }, "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -2388,45 +2399,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2635,20 +2607,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "copyfiles": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.1.1.tgz", - "integrity": "sha512-y6DZHve80whydXzBal7r70TBgKMPKesVRR1Sn/raUu7Jh/i7iSLSyGvYaq0eMJ/3Y/CKghwzjY32q1WzEnpp3Q==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", - "noms": "0.0.0", - "through2": "^2.0.1", - "yargs": "^13.2.4" - } - }, "core-js-compat": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", @@ -2717,6 +2675,19 @@ "sha.js": "^2.4.8" } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3113,78 +3084,71 @@ "dev": true }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", + "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "is-glob": "^4.0.1" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, "eslint-config-prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", - "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.1.0.tgz", + "integrity": "sha512-k9fny9sPjIBQ2ftFTesJV21Rg4R/7a7t7LCtZVrYQiHEp8Nnuk3EGaDmsKSAnsPj0BYcgB2zxzHa2NTkIxcOLg==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -3218,9 +3182,9 @@ } }, "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { "debug": "^2.6.8", @@ -3297,21 +3261,22 @@ } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.11.0" }, "dependencies": { "debug": { @@ -3344,22 +3309,33 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", "dev": true, "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", "object.fromentries": "^2.0.0", - "prop-types": "^15.6.2", - "resolve": "^1.9.0" + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" }, "dependencies": { "doctrine": { @@ -3370,13 +3346,22 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -3384,26 +3369,29 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -3536,9 +3524,9 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -3728,9 +3716,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, "flush-write-stream": { @@ -4436,12 +4424,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -4739,9 +4721,9 @@ "dev": true }, "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -4781,9 +4763,9 @@ "dev": true }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -4792,30 +4774,13 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "invariant": { @@ -5117,12 +5082,13 @@ "dev": true }, "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "dev": true, "requires": { - "array-includes": "^3.0.3" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" } }, "keygrip": { @@ -5809,16 +5775,6 @@ "semver": "^5.3.0" } }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -5981,6 +5937,18 @@ "object-keys": "^1.0.11" } }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.fromentries": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", @@ -6002,6 +5970,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -6217,12 +6197,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -6372,9 +6346,9 @@ "dev": true }, "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", "dev": true }, "private": { @@ -6818,18 +6792,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6958,9 +6920,9 @@ } }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7020,12 +6982,6 @@ "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -7492,6 +7448,17 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string.prototype.padend": { @@ -7512,12 +7479,20 @@ "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } }, "strip-bom": { @@ -7527,9 +7502,9 @@ "dev": true }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "style-loader": { @@ -7588,22 +7563,28 @@ } }, "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } }, "string-width": { "version": "3.1.0", @@ -7615,15 +7596,6 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -8050,6 +8022,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -8247,12 +8225,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -8268,45 +8240,6 @@ "errno": "~0.1.7" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8328,58 +8261,6 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "yargs-parser": { "version": "13.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", diff --git a/package.json b/package.json index ef12f1d..c733bfc 100644 --- a/package.json +++ b/package.json @@ -32,18 +32,19 @@ "@babel/plugin-proposal-object-rest-spread": "^7.4.0", "@babel/preset-env": "^7.5.4", "@babel/preset-react": "^7.0.0", - "babel-eslint": "^10.0.2", + "babel-eslint": "^10.0.3", "babel-loader": "^8.0.6", "component-playground": "^3.0.0", "css-loader": "^1.0.1", - "eslint": "^5.16.0", - "eslint-config-prettier": "^3.6.0", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-react": "^7.12.4", + "eslint": "^6.2.2", + "eslint-config-prettier": "^6.1.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-react": "^7.14.3", "npm-run-all": "^4.1.5", - "prettier": "^1.16.4", + "prettier": "^1.18.2", "prop-types": "^15.7.2", "react": "^16.8.6", + "react-docgen": "^4.1.1", "react-dom": "^16.8.6", "style-loader": "^0.23.1", "styled-jsx": "^3.1.1", From 121427d100b1d32cff0dd58d208ef00171374a68 Mon Sep 17 00:00:00 2001 From: bcliang Date: Tue, 27 Aug 2019 12:59:50 -0700 Subject: [PATCH 5/7] fix tests to match dash[testing] fixture updates --- tests/requirements.txt | 4 +++- tests/test_component.py | 4 ++-- tests/test_extend_maxpoints.py | 4 ++-- tests/test_extend_then_add.py | 4 ++-- tests/test_extend_trace_selectively.py | 4 ++-- tests/test_multiple_trace_types.py | 4 ++-- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 3ee84ef..54b7c68 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -2,7 +2,9 @@ # Switch into a virtual environment # pip install -r requirements.txt -chromedriver-binary==74.0.3729.6 +chromedriver-binary==76.0.3809.126 +dash[testing] +pytest>=5.1.1 ipdb percy selenium diff --git a/tests/test_component.py b/tests/test_component.py index ec3d193..c616350 100644 --- a/tests/test_component.py +++ b/tests/test_component.py @@ -13,7 +13,7 @@ # extending a trace works -def test_component(dash_duo): +def test_extg001_render_component(dash_duo): app = dash.Dash(__name__) app.layout = html.Div([ deg.ExtendableGraph( @@ -49,7 +49,7 @@ def trace_will_extend(n_intervals): def display_data(trigger, figure): return json.dumps(figure['data'][0]) - dash_duo.startServer(app) + dash_duo.start_server(app) graph = dash_duo.find_element("#trace_will_extend") comparison = json.dumps( diff --git a/tests/test_extend_maxpoints.py b/tests/test_extend_maxpoints.py index b741eb7..2390328 100644 --- a/tests/test_extend_maxpoints.py +++ b/tests/test_extend_maxpoints.py @@ -13,7 +13,7 @@ # extending a trace works -def test_extend_maxpoints(dash_duo): +def test_extg002_define_maxpoints(dash_duo): app = dash.Dash(__name__) app.layout = html.Div([ deg.ExtendableGraph( @@ -49,7 +49,7 @@ def trace_will_extend_then_add(n_intervals, figure): def display_data(trigger, figure): return json.dumps(figure['data']) - dash_duo.startServer(app) + dash_duo.start_server(app) graph = dash_duo.find_element("#trace_will_extend_with_window") comparison = json.dumps([ diff --git a/tests/test_extend_then_add.py b/tests/test_extend_then_add.py index eccdfc9..b3aff3c 100644 --- a/tests/test_extend_then_add.py +++ b/tests/test_extend_then_add.py @@ -13,7 +13,7 @@ # extending a trace works -def test_extend_then_add_trace(dash_duo): +def test_extg003_extend_then_add_trace(dash_duo): app = dash.Dash(__name__) app.layout = html.Div([ deg.ExtendableGraph( @@ -54,7 +54,7 @@ def trace_will_extend_then_add(n_intervals): def display_data(trigger, figure): return json.dumps(figure['data']) - dash_duo.startServer(app) + dash_duo.start_server(app) graph = dash_duo.find_element("#trace_will_extend_and_add") comparison = json.dumps([ diff --git a/tests/test_extend_trace_selectively.py b/tests/test_extend_trace_selectively.py index 4d11b93..53fd55e 100644 --- a/tests/test_extend_trace_selectively.py +++ b/tests/test_extend_trace_selectively.py @@ -13,7 +13,7 @@ # extending a trace works -def test_extend_trace_selectively(dash_duo): +def test_extg004_extend_trace_selectively(dash_duo): app = dash.Dash(__name__) app.layout = html.Div([ deg.ExtendableGraph(id='extend_trace_selectively', @@ -47,7 +47,7 @@ def display_data(trigger, figure): return json.dumps(figure['data']) - dash_duo.startServer(app) + dash_duo.start_server(app) graph = dash_duo.find_element("#extend_trace_selectively") comparison = json.dumps( diff --git a/tests/test_multiple_trace_types.py b/tests/test_multiple_trace_types.py index 20667c0..9040739 100644 --- a/tests/test_multiple_trace_types.py +++ b/tests/test_multiple_trace_types.py @@ -13,7 +13,7 @@ # extending a trace works -def test_multiple_trace_types(dash_duo): +def test_extg005_multiple_trace_types(dash_duo): app = dash.Dash(__name__) app.layout = html.Div([ deg.ExtendableGraph(id='multi_trace_types', figure=dict(data=[])), @@ -43,7 +43,7 @@ def display_data(trigger, figure): return json.dumps(figure['data']) - dash_duo.startServer(app) + dash_duo.start_server(app) graph = dash_duo.find_element("#multi_trace_types") comparison = json.dumps( From 4db8f0bdf9489c87539fbb432e99b7a2b687965b Mon Sep 17 00:00:00 2001 From: bcliang Date: Wed, 28 Aug 2019 08:21:47 -0700 Subject: [PATCH 6/7] stick with !== for large objects --- README.md | 4 ++-- src/lib/components/ExtendableGraph.react.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7f880db..e593cad 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,13 @@ $ pip install dash-extendable-graph General examples may be found in `usage.py` -### extendData keys +### extendData properties 1. `updateData` [list]: a list of dictionaries, each containing representing trace data (e.g `dict(x=[1], y=[1])`) 2. `traceIndices` [list, optional]: identify the traces that should be extended. If the specified trace index does not exist, the corresponding trace shall be appended to the figure. 3. `maxPoints` [number, optional]: define the maximum number of points to plot in the figure (per trace). -Based on the [`Plotly.extendTraces()` api](https://github.com/plotly/plotly.js/blob/master/src/plot_api/plot_api.js#L979). +Based on the [`Plotly.extendTraces()` api](https://github.com/plotly/plotly.js/blob/master/src/plot_api/plot_api.js#L979). However, the `updateData` key has been modified to better match the contents of `Plotly.plot()` (e.g. `Graph.figure`). Aside from following dash-familiar styling, this component allows the user to extend traces of different types in a single call (`Plotly.extendTraces()` takes a map of key:val and assumes all traces will share the same data keys). ### Code diff --git a/src/lib/components/ExtendableGraph.react.js b/src/lib/components/ExtendableGraph.react.js index 89298c6..5d2e3f9 100644 --- a/src/lib/components/ExtendableGraph.react.js +++ b/src/lib/components/ExtendableGraph.react.js @@ -281,7 +281,7 @@ class ExtendableGraph extends Component { return; } - const figureChanged = !equals(this.props.figure, nextProps.figure); + const figureChanged = this.props.figure !== nextProps.figure; if (figureChanged) { this.plot(nextProps); } From 12864e65722106cbbc157d980b3c268480452540 Mon Sep 17 00:00:00 2001 From: bcliang Date: Wed, 28 Aug 2019 08:27:12 -0700 Subject: [PATCH 7/7] npm build 1.0.3 --- README.md | 6 ++- dash_extendable_graph/ExtendableGraph.py | 14 +++--- .../dash_extendable_graph.dev.js | 2 +- .../dash_extendable_graph.min.js | 2 +- dash_extendable_graph/metadata.json | 47 +++++++++++++++++-- dash_extendable_graph/package.json | 15 +++--- 6 files changed, 64 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index e593cad..f789630 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,11 @@ $ python usage.py ## Tests -- Run the tests with `$pytest tests` +Integration tests for the component can be found in `tests/` + +`$pytest --headless tests` + +(note: the `--headless` param runs tests without the GUI) ### Create a production build and publish: diff --git a/dash_extendable_graph/ExtendableGraph.py b/dash_extendable_graph/ExtendableGraph.py index d2ad605..5e0228b 100644 --- a/dash_extendable_graph/ExtendableGraph.py +++ b/dash_extendable_graph/ExtendableGraph.py @@ -73,7 +73,7 @@ class ExtendableGraph(Component): unless a separate `edits` config item overrides individual parts - edits (dict; optional): A set of editable properties. edits has the following type: dict containing keys 'annotationPosition', 'annotationTail', 'annotationText', 'axisTitleText', 'colorbarPosition', 'colorbarTitleText', 'legendPosition', 'legendText', 'shapePosition', 'titleText'. Those keys have the following types: - - annotationPosition (boolean; optional): annotationPosition: the main anchor of the annotation, which is the + - annotationPosition (boolean; optional): The main anchor of the annotation, which is the text (if no arrow) or the arrow (which drags the whole thing leaving the arrow length & direction unchanged) - annotationTail (boolean; optional): Just for annotations with arrows, change the length and direction of the arrow @@ -107,12 +107,12 @@ class ExtendableGraph(Component): - modeBarButtonsToRemove (list; optional): Remove mode bar button by name. All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js Common names include: - - sendDataToCloud -- (2D): zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d -- (Cartesian): hoverClosestCartesian, hoverCompareCartesian -- (3D): zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d -- (Geo): zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo -- hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews +sendDataToCloud; +(2D) zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d; +(Cartesian) hoverClosestCartesian, hoverCompareCartesian; +(3D) zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d; +(Geo) zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo; +hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews. - modeBarButtonsToAdd (list; optional): Add mode bar button using config objects - modeBarButtons (boolean | number | string | dict | list; optional): Fully custom mode bar buttons as nested array, where the outer arrays represents button groups, and diff --git a/dash_extendable_graph/dash_extendable_graph.dev.js b/dash_extendable_graph/dash_extendable_graph.dev.js index 1206275..d4438e5 100644 --- a/dash_extendable_graph/dash_extendable_graph.dev.js +++ b/dash_extendable_graph/dash_extendable_graph.dev.js @@ -4043,7 +4043,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _int /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"prop-types\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ \"./node_modules/ramda/es/index.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n\n\n\n/* global Plotly:true */\n\nvar filterEventData = function filterEventData(gd, eventData, event) {\n var filteredEventData;\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"contains\"])(event, ['click', 'hover', 'selected'])) {\n var points = [];\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(eventData)) {\n return null;\n }\n /*\r\n * remove `data`, `layout`, `xaxis`, etc\r\n * objects from the event data since they're so big\r\n * and cause JSON stringify ciricular structure errors.\r\n *\r\n * also, pull down the `customdata` point from the data array\r\n * into the event object\r\n */\n\n\n var data = gd.data;\n\n for (var i = 0; i < eventData.points.length; i++) {\n var fullPoint = eventData.points[i];\n var pointData = Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"filter\"])(function (o) {\n return !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"contains\"])(Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"type\"])(o), ['Object', 'Array']);\n }, fullPoint);\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('curveNumber', fullPoint) && Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('pointNumber', fullPoint) && Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('customdata', data[pointData.curveNumber])) {\n pointData.customdata = data[pointData.curveNumber].customdata[fullPoint.pointNumber];\n } // specific to histogram. see https://github.com/plotly/plotly.js/pull/2113/\n\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('pointNumbers', fullPoint)) {\n pointData.pointNumbers = fullPoint.pointNumbers;\n }\n\n points[i] = pointData;\n }\n\n filteredEventData = {\n points: points\n };\n } else if (event === 'relayout' || event === 'restyle') {\n /*\r\n * relayout shouldn't include any big objects\r\n * it will usually just contain the ranges of the axes like\r\n * \"xaxis.range[0]\": 0.7715822247381828,\r\n * \"xaxis.range[1]\": 3.0095292008680063`\r\n */\n filteredEventData = eventData;\n }\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('range', eventData)) {\n filteredEventData.range = eventData.range;\n }\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('lassoPoints', eventData)) {\n filteredEventData.lassoPoints = eventData.lassoPoints;\n }\n\n return filteredEventData;\n};\n\nfunction generateId() {\n var charAmount = 36;\n var length = 7;\n return 'graph-' + Math.random().toString(charAmount).substring(2, length);\n}\n/**\r\n * ExtendableGraph can be used to render any plotly.js-powered data vis.\r\n *\r\n * You can define callbacks based on user interaction with ExtendableGraphs such\r\n * as hovering, clicking or selecting\r\n */\n\n\nvar ExtendableGraphWithDefaults = function ExtendableGraphWithDefaults(props) {\n var id = props.id ? props.id : generateId();\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(ExtendableGraph, _extends({}, props, {\n id: id\n }));\n};\n\nvar ExtendableGraph =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ExtendableGraph, _Component);\n\n function ExtendableGraph(props) {\n var _this;\n\n _classCallCheck(this, ExtendableGraph);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ExtendableGraph).call(this, props));\n _this.bindEvents = _this.bindEvents.bind(_assertThisInitialized(_this));\n _this._hasPlotted = false;\n _this.graphResize = _this.graphResize.bind(_assertThisInitialized(_this));\n return _this;\n }\n\n _createClass(ExtendableGraph, [{\n key: \"plot\",\n value: function plot(props) {\n var _this2 = this;\n\n var figure = props.figure,\n id = props.id,\n animate = props.animate,\n animation_options = props.animation_options,\n config = props.config;\n var gd = document.getElementById(id);\n\n if (animate && this._hasPlotted && figure.data.length === gd.data.length) {\n return Plotly.animate(id, figure, animation_options);\n }\n\n return Plotly.react(id, {\n data: figure.data,\n layout: Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"clone\"])(figure.layout),\n frames: figure.frames,\n config: config\n }).then(function () {\n if (!_this2._hasPlotted) {\n var _gd = document.getElementById(id);\n\n if (_gd) {\n _this2.bindEvents();\n\n Plotly.Plots.resize(_gd);\n _this2._hasPlotted = true;\n }\n }\n });\n }\n }, {\n key: \"extend\",\n value: function extend(props) {\n var id = props.id,\n extendData = props.extendData;\n var gd = document.getElementById(id);\n var updateData, traceIndices, maxPoints;\n\n if (extendData) {\n var createDataObject = function createDataObject(data) {\n var dataprops = Object.keys(data);\n var ret = {};\n\n for (var i = 0; i < dataprops.length; i++) {\n ret[dataprops[i]] = [data[dataprops[i]]];\n }\n\n return ret;\n };\n\n if (gd.data.length < 1) {\n // figure has no pre-existing data. redirect to plot()\n props.figure.data = extendData;\n return this.plot(props);\n }\n\n if (Array.isArray(extendData) && Array.isArray(extendData[0])) {\n var _extendData = _slicedToArray(extendData, 3);\n\n updateData = _extendData[0];\n traceIndices = _extendData[1];\n maxPoints = _extendData[2];\n } else {\n updateData = extendData;\n }\n\n if (!traceIndices) {\n traceIndices = Array.from(Array(updateData.length).keys());\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = updateData.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _step$value = _slicedToArray(_step.value, 2),\n i = _step$value[0],\n value = _step$value[1];\n\n var updateObject = createDataObject(value);\n\n if (i < updateData.length - 1) {\n if (traceIndices[i] < gd.data.length) {\n Plotly.extendTraces(id, updateObject, [traceIndices[i]], maxPoints);\n } else {\n Plotly.addTraces(id, value);\n }\n } else {\n if (traceIndices[i] < gd.data.length) {\n return Plotly.extendTraces(id, updateObject, [traceIndices[i]], maxPoints);\n }\n\n return Plotly.addTraces(id, value);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) {\n _iterator[\"return\"]();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n\n return this.plot(props);\n }\n }, {\n key: \"graphResize\",\n value: function graphResize() {\n var graphDiv = document.getElementById(this.props.id);\n\n if (graphDiv) {\n Plotly.Plots.resize(graphDiv);\n }\n }\n }, {\n key: \"bindEvents\",\n value: function bindEvents() {\n var _this$props = this.props,\n id = _this$props.id,\n setProps = _this$props.setProps,\n clear_on_unhover = _this$props.clear_on_unhover;\n var gd = document.getElementById(id);\n gd.on('plotly_click', function (eventData) {\n var clickData = filterEventData(gd, eventData, 'click');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(clickData)) {\n setProps({\n clickData: clickData\n });\n }\n });\n gd.on('plotly_clickannotation', function (eventData) {\n var clickAnnotationData = Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"omit\"])(['event', 'fullAnnotation'], eventData);\n setProps({\n clickAnnotationData: clickAnnotationData\n });\n });\n gd.on('plotly_hover', function (eventData) {\n var hoverData = filterEventData(gd, eventData, 'hover');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(hoverData)) {\n setProps({\n hoverData: hoverData\n });\n }\n });\n gd.on('plotly_selected', function (eventData) {\n var selectedData = filterEventData(gd, eventData, 'selected');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(selectedData)) {\n setProps({\n selectedData: selectedData\n });\n }\n });\n gd.on('plotly_deselect', function () {\n setProps({\n selectedData: null\n });\n });\n gd.on('plotly_relayout', function (eventData) {\n var relayoutData = filterEventData(gd, eventData, 'relayout');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(relayoutData)) {\n setProps({\n relayoutData: relayoutData\n });\n }\n });\n gd.on('plotly_restyle', function (eventData) {\n var restyleData = filterEventData(gd, eventData, 'restyle');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(restyleData)) {\n setProps({\n restyleData: restyleData\n });\n }\n });\n gd.on('plotly_unhover', function () {\n if (clear_on_unhover) {\n setProps({\n hoverData: null\n });\n }\n });\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this3 = this;\n\n this.plot(this.props).then(function () {\n window.addEventListener('resize', _this3.graphResize);\n });\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (this.eventEmitter) {\n this.eventEmitter.removeAllListeners();\n }\n\n window.removeEventListener('resize', this.graphResize);\n }\n }, {\n key: \"shouldComponentUpdate\",\n value: function shouldComponentUpdate(nextProps) {\n return this.props.id !== nextProps.id || JSON.stringify(this.props.style) !== JSON.stringify(nextProps.style);\n }\n }, {\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var idChanged = this.props.id !== nextProps.id;\n\n if (idChanged) {\n /*\r\n * then the dom needs to get re-rendered with a new ID.\r\n * the graph will get updated in componentDidUpdate\r\n */\n return;\n }\n\n var figureChanged = this.props.figure !== nextProps.figure;\n\n if (figureChanged) {\n this.plot(nextProps);\n }\n\n var extendDataChanged = this.props.extendData !== nextProps.extendData;\n\n if (extendDataChanged) {\n this.extend(nextProps);\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n if (prevProps.id !== this.props.id) {\n this.plot(this.props);\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n id = _this$props2.id,\n style = _this$props2.style,\n loading_state = _this$props2.loading_state;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n key: id,\n id: id,\n \"data-dash-is-loading\": loading_state && loading_state.is_loading || undefined,\n style: style,\n className: className\n });\n }\n }]);\n\n return ExtendableGraph;\n}(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\nvar graphPropTypes = {\n /**\r\n * The ID of this component, used to identify dash components\r\n * in callbacks. The ID needs to be unique across all of the\r\n * components in an app.\r\n */\n id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Data from latest click event. Read-only.\r\n */\n clickData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest click annotation event. Read-only.\r\n */\n clickAnnotationData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest hover event. Read-only.\r\n */\n hoverData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * If True, `clear_on_unhover` will clear the `hoverData` property\r\n * when the user \"unhovers\" from a point.\r\n * If False, then the `hoverData` property will be equal to the\r\n * data from the last point that was hovered over.\r\n */\n clear_on_unhover: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Data from latest select event. Read-only.\r\n */\n selectedData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest relayout event which occurs\r\n * when the user zooms or pans on the plot or other\r\n * layout-level edits. Has the form `{: }`\r\n * describing the changes made. Read-only.\r\n */\n relayoutData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data that should be appended to existing traces. Has the form\r\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an array\r\n * containing data objects to extend, `traceIndices` (optional) is an array\r\n * of trace indices that should be extended, and `maxPoints` (optional) is\r\n * either an integer defining the maximum number of points allowed or an\r\n * object with key:value pairs matching `updateData`\r\n * Reference the Plotly.extendTraces API for full usage:\r\n * https://plot.ly/javascript/plotlyjs-function-reference/#plotlyextendtraces\r\n */\n extendData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]),\n\n /**\r\n * Data from latest restyle event which occurs\r\n * when the user toggles a legend item, changes\r\n * parcoords selections, or other trace-level edits.\r\n * Has the form `[edits, indices]`, where `edits` is an object\r\n * `{: }` describing the changes made,\r\n * and `indices` is an array of trace indices that were edited.\r\n * Read-only.\r\n */\n restyleData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Plotly `figure` object. See schema:\r\n * https://plot.ly/javascript/reference\r\n *\r\n * `config` is set separately by the `config` property\r\n */\n figure: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object),\n layout: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n frames: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object)\n }),\n\n /**\r\n * Generic style overrides on the plot div\r\n */\n style: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * className of the parent div\r\n */\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Beta: If true, animate between updates using\r\n * plotly.js's `animate` function\r\n */\n animate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Beta: Object containing animation settings.\r\n * Only applies if `animate` is `true`\r\n */\n animation_options: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Plotly.js config options.\r\n * See https://plot.ly/javascript/configuration-options/\r\n * for more info.\r\n */\n config: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * No interactivity, for export or image generation\r\n */\n staticPlot: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Base URL for a Plotly cloud instance, if `showSendToCloud` is enabled\r\n */\n plotlyServerURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * We can edit titles, move annotations, etc - sets all pieces of `edits`\r\n * unless a separate `edits` config item overrides individual parts\r\n */\n editable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * A set of editable properties\r\n */\n edits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * annotationPosition: the main anchor of the annotation, which is the\r\n * text (if no arrow) or the arrow (which drags the whole thing leaving\r\n * the arrow length & direction unchanged)\r\n */\n annotationPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Just for annotations with arrows, change the length and direction of the arrow\r\n */\n annotationTail: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n annotationText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n axisTitleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n colorbarPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n colorbarTitleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n legendPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Edit the trace name fields from the legend\r\n */\n legendText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n shapePosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * The global `layout.title`\r\n */\n titleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n }),\n\n /**\r\n * DO autosize once regardless of layout.autosize\r\n * (use default width or height values otherwise)\r\n */\n autosizable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Whether to change layout size when the window size changes\r\n */\n responsive: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Set the length of the undo/redo queue\r\n */\n queueLength: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * If we DO autosize, do we fill the container or the screen?\r\n */\n fillFrame: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * If we DO autosize, set the frame margins in percents of plot size\r\n */\n frameMargins: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Mousewheel or two-finger scroll zooms the plot\r\n */\n scrollZoom: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Double click interaction (false, 'reset', 'autosize' or 'reset+autosize')\r\n */\n doubleClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([false, 'reset', 'autosize', 'reset+autosize']),\n\n /**\r\n * New users see some hints about interactivity\r\n */\n showTips: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Enable axis pan/zoom drag handles\r\n */\n showAxisDragHandles: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Enable direct range entry at the pan/zoom drag points\r\n * (drag handles must be enabled above)\r\n */\n showAxisRangeEntryBoxes: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Link to open this plot in plotly\r\n */\n showLink: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * If we show a link, does it contain data or just link to a plotly file?\r\n */\n sendData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Text appearing in the sendData link\r\n */\n linkText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Display the mode bar (true, false, or 'hover')\r\n */\n displayModeBar: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([true, false, 'hover']),\n\n /**\r\n * Should we include a modebar button to send this data to a\r\n * Plotly Cloud instance, linked by `plotlyServerURL`.\r\n * By default this is false.\r\n */\n showSendToCloud: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Remove mode bar button by name.\r\n * All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js\r\n * Common names include:\r\n * - sendDataToCloud\r\n * - (2D): zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d\r\n * - (Cartesian): hoverClosestCartesian, hoverCompareCartesian\r\n * - (3D): zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d\r\n * - (Geo): zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo\r\n * - hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews\r\n */\n modeBarButtonsToRemove: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Add mode bar button using config objects\r\n */\n modeBarButtonsToAdd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Fully custom mode bar buttons as nested array,\r\n * where the outer arrays represents button groups, and\r\n * the inner arrays have buttons config objects or names of default buttons\r\n */\n modeBarButtons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,\n\n /**\r\n * Modifications to how the toImage modebar button works\r\n */\n toImageButtonOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * The file format to create\r\n */\n format: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['jpeg', 'png', 'webp', 'svg']),\n\n /**\r\n * The name given to the downloaded file\r\n */\n filename: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Width of the downloaded file, in px\r\n */\n width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Height of the downloaded file, in px\r\n */\n height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Extra resolution to give the file after\r\n * rendering it with the given width and height\r\n */\n scale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n }),\n\n /**\r\n * Add the plotly logo on the end of the mode bar\r\n */\n displaylogo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Add the plotly logo even with no modebar\r\n */\n watermark: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Increase the pixel ratio for Gl plot images\r\n */\n plotGlPixelRatio: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * URL to topojson files used in geo charts\r\n */\n topojsonURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Mapbox access token (required to plot mapbox trace types)\r\n * If using an Mapbox Atlas server, set this option to '',\r\n * so that plotly.js won't attempt to authenticate to the public Mapbox server.\r\n */\n mapboxAccessToken: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,\n\n /**\r\n * The locale to use. Locales may be provided with the plot\r\n * (`locales` below) or by loading them on the page, see:\r\n * https://github.com/plotly/plotly.js/blob/master/dist/README.md#to-include-localization\r\n */\n locale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Localization definitions, if you choose to provide them with the\r\n * plot rather than registering them globally.\r\n */\n locales: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n }),\n\n /**\r\n * Function that updates the state tree.\r\n */\n setProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n\n /**\r\n * Object that holds the loading state object coming from dash-renderer\r\n */\n loading_state: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n /**\r\n * Determines if the component is loading or not\r\n */\n is_loading: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Holds which property is loading\r\n */\n prop_name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Holds the name of the component that is loading\r\n */\n component_name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n })\n};\nvar graphDefaultProps = {\n clickData: null,\n clickAnnotationData: null,\n hoverData: null,\n selectedData: null,\n relayoutData: null,\n extendData: null,\n restyleData: null,\n figure: {\n data: [],\n layout: {},\n frames: []\n },\n animate: false,\n animation_options: {\n frame: {\n redraw: false\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out'\n }\n },\n clear_on_unhover: false,\n config: {}\n};\nExtendableGraphWithDefaults.propTypes = graphPropTypes;\nExtendableGraph.propTypes = graphPropTypes;\nExtendableGraphWithDefaults.defaultProps = graphDefaultProps;\nExtendableGraph.defaultProps = graphDefaultProps;\n/* harmony default export */ __webpack_exports__[\"default\"] = (ExtendableGraphWithDefaults);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2V4dGVuZGFibGVfZ3JhcGgvLi9zcmMvbGliL2NvbXBvbmVudHMvRXh0ZW5kYWJsZUdyYXBoLnJlYWN0LmpzP2RiNTYiXSwibmFtZXMiOlsiZmlsdGVyRXZlbnREYXRhIiwiZ2QiLCJldmVudERhdGEiLCJldmVudCIsImZpbHRlcmVkRXZlbnREYXRhIiwiY29udGFpbnMiLCJwb2ludHMiLCJpc05pbCIsImRhdGEiLCJpIiwibGVuZ3RoIiwiZnVsbFBvaW50IiwicG9pbnREYXRhIiwiZmlsdGVyIiwibyIsInR5cGUiLCJoYXMiLCJjdXJ2ZU51bWJlciIsImN1c3RvbWRhdGEiLCJwb2ludE51bWJlciIsInBvaW50TnVtYmVycyIsInJhbmdlIiwibGFzc29Qb2ludHMiLCJnZW5lcmF0ZUlkIiwiY2hhckFtb3VudCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsIkV4dGVuZGFibGVHcmFwaFdpdGhEZWZhdWx0cyIsInByb3BzIiwiaWQiLCJFeHRlbmRhYmxlR3JhcGgiLCJiaW5kRXZlbnRzIiwiYmluZCIsIl9oYXNQbG90dGVkIiwiZ3JhcGhSZXNpemUiLCJmaWd1cmUiLCJhbmltYXRlIiwiYW5pbWF0aW9uX29wdGlvbnMiLCJjb25maWciLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiUGxvdGx5IiwicmVhY3QiLCJsYXlvdXQiLCJjbG9uZSIsImZyYW1lcyIsInRoZW4iLCJQbG90cyIsInJlc2l6ZSIsImV4dGVuZERhdGEiLCJ1cGRhdGVEYXRhIiwidHJhY2VJbmRpY2VzIiwibWF4UG9pbnRzIiwiY3JlYXRlRGF0YU9iamVjdCIsImRhdGFwcm9wcyIsIk9iamVjdCIsImtleXMiLCJyZXQiLCJwbG90IiwiQXJyYXkiLCJpc0FycmF5IiwiZnJvbSIsImVudHJpZXMiLCJ2YWx1ZSIsInVwZGF0ZU9iamVjdCIsImV4dGVuZFRyYWNlcyIsImFkZFRyYWNlcyIsImdyYXBoRGl2Iiwic2V0UHJvcHMiLCJjbGVhcl9vbl91bmhvdmVyIiwib24iLCJjbGlja0RhdGEiLCJjbGlja0Fubm90YXRpb25EYXRhIiwib21pdCIsImhvdmVyRGF0YSIsInNlbGVjdGVkRGF0YSIsInJlbGF5b3V0RGF0YSIsInJlc3R5bGVEYXRhIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50RW1pdHRlciIsInJlbW92ZUFsbExpc3RlbmVycyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJuZXh0UHJvcHMiLCJKU09OIiwic3RyaW5naWZ5Iiwic3R5bGUiLCJpZENoYW5nZWQiLCJmaWd1cmVDaGFuZ2VkIiwiZXh0ZW5kRGF0YUNoYW5nZWQiLCJleHRlbmQiLCJwcmV2UHJvcHMiLCJjbGFzc05hbWUiLCJsb2FkaW5nX3N0YXRlIiwiaXNfbG9hZGluZyIsInVuZGVmaW5lZCIsIkNvbXBvbmVudCIsImdyYXBoUHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCIsIm9uZU9mVHlwZSIsImFycmF5IiwiZXhhY3QiLCJhcnJheU9mIiwic3RhdGljUGxvdCIsInBsb3RseVNlcnZlclVSTCIsImVkaXRhYmxlIiwiZWRpdHMiLCJhbm5vdGF0aW9uUG9zaXRpb24iLCJhbm5vdGF0aW9uVGFpbCIsImFubm90YXRpb25UZXh0IiwiYXhpc1RpdGxlVGV4dCIsImNvbG9yYmFyUG9zaXRpb24iLCJjb2xvcmJhclRpdGxlVGV4dCIsImxlZ2VuZFBvc2l0aW9uIiwibGVnZW5kVGV4dCIsInNoYXBlUG9zaXRpb24iLCJ0aXRsZVRleHQiLCJhdXRvc2l6YWJsZSIsInJlc3BvbnNpdmUiLCJxdWV1ZUxlbmd0aCIsIm51bWJlciIsImZpbGxGcmFtZSIsImZyYW1lTWFyZ2lucyIsInNjcm9sbFpvb20iLCJkb3VibGVDbGljayIsIm9uZU9mIiwic2hvd1RpcHMiLCJzaG93QXhpc0RyYWdIYW5kbGVzIiwic2hvd0F4aXNSYW5nZUVudHJ5Qm94ZXMiLCJzaG93TGluayIsInNlbmREYXRhIiwibGlua1RleHQiLCJkaXNwbGF5TW9kZUJhciIsInNob3dTZW5kVG9DbG91ZCIsIm1vZGVCYXJCdXR0b25zVG9SZW1vdmUiLCJtb2RlQmFyQnV0dG9uc1RvQWRkIiwibW9kZUJhckJ1dHRvbnMiLCJhbnkiLCJ0b0ltYWdlQnV0dG9uT3B0aW9ucyIsImZvcm1hdCIsImZpbGVuYW1lIiwid2lkdGgiLCJoZWlnaHQiLCJzY2FsZSIsImRpc3BsYXlsb2dvIiwid2F0ZXJtYXJrIiwicGxvdEdsUGl4ZWxSYXRpbyIsInRvcG9qc29uVVJMIiwibWFwYm94QWNjZXNzVG9rZW4iLCJsb2NhbGUiLCJsb2NhbGVzIiwiZnVuYyIsInNoYXBlIiwicHJvcF9uYW1lIiwiY29tcG9uZW50X25hbWUiLCJncmFwaERlZmF1bHRQcm9wcyIsImZyYW1lIiwicmVkcmF3IiwidHJhbnNpdGlvbiIsImR1cmF0aW9uIiwiZWFzZSIsInByb3BUeXBlcyIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQU1BLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQ0MsRUFBRCxFQUFLQyxTQUFMLEVBQWdCQyxLQUFoQixFQUEwQjtBQUM5QyxNQUFJQyxpQkFBSjs7QUFDQSxNQUFJQyxzREFBUSxDQUFDRixLQUFELEVBQVEsQ0FBQyxPQUFELEVBQVUsT0FBVixFQUFtQixVQUFuQixDQUFSLENBQVosRUFBcUQ7QUFDakQsUUFBTUcsTUFBTSxHQUFHLEVBQWY7O0FBRUEsUUFBSUMsbURBQUssQ0FBQ0wsU0FBRCxDQUFULEVBQXNCO0FBQ2xCLGFBQU8sSUFBUDtBQUNIO0FBRUQ7Ozs7Ozs7Ozs7QUFRQSxRQUFNTSxJQUFJLEdBQUdQLEVBQUUsQ0FBQ08sSUFBaEI7O0FBRUEsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHUCxTQUFTLENBQUNJLE1BQVYsQ0FBaUJJLE1BQXJDLEVBQTZDRCxDQUFDLEVBQTlDLEVBQWtEO0FBQzlDLFVBQU1FLFNB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R0FSYztBQVN0QlQsU0FBTyxFQUFFLEtBVGE7QUFVdEJDLG1CQUFpQixFQUFFO0FBQ2YwSCxTQUFLLEVBQUU7QUFDSEMsWUFBTSxFQUFFO0FBREwsS0FEUTtBQUlmQyxjQUFVLEVBQUU7QUFDUkMsY0FBUSxFQUFFLEdBREY7QUFFUkMsVUFBSSxFQUFFO0FBRkU7QUFKRyxHQVZHO0FBbUJ0QjlGLGtCQUFnQixFQUFFLEtBbkJJO0FBb0J0Qi9CLFFBQU0sRUFBRTtBQXBCYyxDQUExQjtBQXVCQVgsMkJBQTJCLENBQUN5SSxTQUE1QixHQUF3Q25FLGNBQXhDO0FBQ0FuRSxlQUFlLENBQUNzSSxTQUFoQixHQUE0Qm5FLGNBQTVCO0FBRUF0RSwyQkFBMkIsQ0FBQzBJLFlBQTVCLEdBQTJDUCxpQkFBM0M7QUFDQWhJLGVBQWUsQ0FBQ3VJLFlBQWhCLEdBQStCUCxpQkFBL0I7QUFFZW5JLDBGQUFmIiwiZmlsZSI6Ii4vc3JjL2xpYi9jb21wb25lbnRzL0V4dGVuZGFibGVHcmFwaC5yZWFjdC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xyXG5pbXBvcnQge2NvbnRhaW5zLCBmaWx0ZXIsIGNsb25lLCBoYXMsIGlzTmlsLCB0eXBlLCBvbWl0fSBmcm9tICdyYW1kYSc7XHJcbi8qIGdsb2JhbCBQbG90bHk6dHJ1ZSAqL1xyXG5cclxuY29uc3QgZmlsdGVyRXZlbnREYXRhID0gKGdkLCBldmVudERhdGEsIGV2ZW50KSA9PiB7XHJcbiAgICBsZXQgZmlsdGVyZWRFdmVudERhdGE7XHJcbiAgICBpZiAoY29udGFpbnMoZXZlbnQsIFsnY2xpY2snLCAnaG92ZXInLCAnc2VsZWN0ZWQnXSkpIHtcclxuICAgICAgICBjb25zdCBwb2ludHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmlsKGV2ZW50RGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIHJlbW92ZSBgZGF0YWAsIGBsYXlvdXRgLCBgeGF4aXNgLCBldGNcclxuICAgICAgICAgKiBvYmplY3RzIGZyb20gdGhlIGV2ZW50IGRhdGEgc2luY2UgdGhleSdyZSBzbyBiaWdcclxuICAgICAgICAgKiBhbmQgY2F1c2UgSlNPTiBzdHJpbmdpZnkgY2lyaWN1bGFyIHN0cnVjdHVyZSBlcnJvcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBhbHNvLCBwdWxsIGRvd24gdGhlIGBjdXN0b21kYXRhYCBwb2ludCBmcm9tIHRoZSBkYXRhIGFycmF5XHJcbiAgICAgICAgICogaW50byB0aGUgZXZlbnQgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGdkLmRhdGE7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnREYXRhLnBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUG9pbnQgPSBldmVudERhdGEucG9pbnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludERhdGEgPSBmaWx0ZXIoZnVuY3Rpb24obykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWlucyh0eXBlKG8pLCBbJ09iamVjdCcsICdBcnJheSddKTtcclxuICAgICAgICAgICAgfSwgZnVsbFBvaW50KTtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgaGFzKCdjdXJ2ZU51bWJlcicsIGZ1bGxQb2ludCkgJiZcclxuICAgICAgICAgICAgICAgIGhhcygncG9pbnROdW1iZXInLCBmdWxsUG9pbnQpICYmXHJcbiAgICAgICAgICAgICAgICBoYXMoJ2N1c3RvbWRhdGEnLCBkYXRhW3BvaW50RGF0YS5jdXJ2ZU51bWJlcl0pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcG9pbnREYXRhLmN1c3RvbWRhdGEgPVxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFbcG9pbnREYXRhLmN1cnZlTnVtYmVyXS5jdXN0b21kYXRhW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsUG9pbnQucG9pbnROdW1iZXJcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzcGVjaWZpYyB0byBoaXN0b2dyYW0uIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9wdWxsLzIxMTMvXHJcbiAgICAgICAgICAgIGlmIChoYXMoJ3BvaW50TnVtYmVycycsIGZ1bGxQb2ludCkpIHtcclxuICAgICAgICAgICAgICAgIHBvaW50RGF0YS5wb2ludE51bWJlcnMgPSBmdWxsUG9pbnQucG9pbnROdW1iZXJzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludERhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbHRlcmVkRXZlbnREYXRhID0ge3BvaW50c307XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAncmVsYXlvdXQnIHx8IGV2ZW50ID09PSAncmVzdHlsZScpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIHJlbGF5b3V0IHNob3VsZG4ndCBpbmNsdWRlIGFueSBiaWcgb2JqZWN0c1xyXG4gICAgICAgICAqIGl0IHdpbGwgdXN1YWxseSBqdXN0IGNvbnRhaW4gdGhlIHJhbmdlcyBvZiB0aGUgYXhlcyBsaWtlXHJcbiAgICAgICAgICogXCJ4YXhpcy5yYW5nZVswXVwiOiAwLjc3MTU4MjIyNDczODE4MjgsXHJcbiAgICAgICAgICogXCJ4YXhpcy5yYW5nZVsxXVwiOiAzLjAwOTUyOTIwMDg2ODAwNjNgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZmlsdGVyZWRFdmVudERhdGEgPSBldmVudERhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzKCdyYW5nZScsIGV2ZW50RGF0YSkpIHtcclxuICAgICAgICBmaWx0ZXJlZEV2ZW50RGF0YS5yYW5nZSA9IGV2ZW50RGF0YS5yYW5nZTtcclxuICAgIH1cclxuICAgIGlmIChoYXMoJ2xhc3NvUG9pbnRzJywgZXZlbnREYXRhKSkge1xyXG4gICAgICAgIGZpbHRlcmVkRXZlbnREYXRhLmxhc3NvUG9pbnRzID0gZXZlbnREYXRhLmxhc3NvUG9pbnRzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbHRlcmVkRXZlbnREYXRhO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHtcclxuICAgIGNvbnN0IGNoYXJBbW91bnQgPSAzNjtcclxuICAgIGNvbnN0IGxlbmd0aCA9IDc7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgICdncmFwaC0nICtcclxuICAgICAgICBNYXRoLnJhbmRvbSgpXHJcbiAgICAgICAgICAgIC50b1N0cmluZyhjaGFyQW1vdW50KVxyXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDIsIGxlbmd0aClcclxuICAgICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRhYmxlR3JhcGggY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGFueSBwbG90bHkuanMtcG93ZXJlZCBkYXRhIHZpcy5cclxuICpcclxuICogWW91IGNhbiBkZWZpbmUgY2FsbGJhY2tzIGJhc2VkIG9uIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCBFeHRlbmRhYmxlR3JhcGhzIHN1Y2hcclxuICogYXMgaG92ZXJpbmcsIGNsaWNraW5nIG9yIHNlbGVjdGluZ1xyXG4gKi9cclxuY29uc3QgRXh0ZW5kYWJsZUdyYXBoV2l0aERlZmF1bHRzID0gcHJvcHMgPT4ge1xyXG4gICAgY29uc3QgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogZ2VuZXJhdGVJZCgpO1xyXG4gICAgcmV0dXJuIDxFeHRlbmRhYmxlR3JhcGggey4uLnByb3BzfSBpZD17aWR9IC8+O1xyXG59O1xyXG5cclxuY2xhc3MgRXh0ZW5kYWJsZUdyYXBoIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyA9IHRoaXMuYmluZEV2ZW50cy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhc1Bsb3R0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyYXBoUmVzaXplID0gdGhpcy5ncmFwaFJlc2l6ZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBsb3QocHJvcHMpIHtcclxuICAgICAgICBjb25zdCB7ZmlndXJlLCBpZCwgYW5pbWF0ZSwgYW5pbWF0aW9uX29wdGlvbnMsIGNvbmZpZ30gPSBwcm9wcztcclxuICAgICAgICBjb25zdCBnZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBhbmltYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2hhc1Bsb3R0ZWQgJiZcclxuICAgICAgICAgICAgZmlndXJlLmRhdGEubGVuZ3RoID09PSBnZC5kYXRhLmxlbmd0aFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gUGxvdGx5LmFuaW1hdGUoaWQsIGZpZ3VyZSwgYW5pbWF0aW9uX29wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUGxvdGx5LnJlYWN0KGlkLCB7XHJcbiAgICAgICAgICAgIGRhdGE6IGZpZ3VyZS5kYXRhLFxyXG4gICAgICAgICAgICBsYXlvdXQ6IGNsb25lKGZpZ3VyZS5sYXlvdXQpLFxyXG4gICAgICAgICAgICBmcmFtZXM6IGZpZ3VyZS5mcmFtZXMsXHJcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2hhc1Bsb3R0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgUGxvdGx5LlBsb3RzLnJlc2l6ZShnZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzUGxvdHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHRlbmQocHJvcHMpIHtcclxuICAgICAgICBjb25zdCB7aWQsIGV4dGVuZERhdGF9ID0gcHJvcHM7XHJcbiAgICAgICAgY29uc3QgZ2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICAgICAgbGV0IHVwZGF0ZURhdGEsIHRyYWNlSW5kaWNlcywgbWF4UG9pbnRzO1xyXG5cclxuICAgICAgICBpZiAoZXh0ZW5kRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZ2QuZGF0YS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaWd1cmUgaGFzIG5vIHByZS1leGlzdGluZyBkYXRhLiByZWRpcmVjdCB0byBwbG90KClcclxuICAgICAgICAgICAgICAgIHByb3BzLmZpZ3VyZS5kYXRhID0gZXh0ZW5kRGF0YTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3QocHJvcHMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHRlbmREYXRhKSAmJiBBcnJheS5pc0FycmF5KGV4dGVuZERhdGFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlRGF0YSwgdHJhY2VJbmRpY2VzLCBtYXhQb2ludHNdID0gZXh0ZW5kRGF0YTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZURhdGEgPSBleHRlbmREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRyYWNlSW5kaWNlcykge1xyXG4gICAgICAgICAgICAgICAgdHJhY2VJbmRpY2VzID0gQXJyYXkuZnJvbShBcnJheSh1cGRhdGVEYXRhLmxlbmd0aCkua2V5cygpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlRGF0YU9iamVjdChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhcHJvcHMgPSBPYmplY3Qua2V5cyhkYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhcHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByZXRbZGF0YXByb3BzW2ldXSA9IFtkYXRhW2RhdGFwcm9wc1tpXV1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgdmFsdWVdIG9mIHVwZGF0ZURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVPYmplY3QgPSBjcmVhdGVEYXRhT2JqZWN0KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpIDwgdXBkYXRlRGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlSW5kaWNlc1tpXSA8IGdkLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsb3RseS5leHRlbmRUcmFjZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9iamVjdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFjZUluZGljZXNbaV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxvdGx5LmFkZFRyYWNlcyhpZCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlSW5kaWNlc1tpXSA8IGdkLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbG90bHkuZXh0ZW5kVHJhY2VzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhY2VJbmRpY2VzW2ldXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvaW50c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGxvdGx5LmFkZFRyYWNlcyhpZCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wbG90KHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBncmFwaFJlc2l6ZSgpIHtcclxuICAgICAgICBjb25zdCBncmFwaERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMuaWQpO1xyXG4gICAgICAgIGlmIChncmFwaERpdikge1xyXG4gICAgICAgICAgICBQbG90bHkuUGxvdHMucmVzaXplKGdyYXBoRGl2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYmluZEV2ZW50cygpIHtcclxuICAgICAgICBjb25zdCB7aWQsIHNldFByb3BzLCBjbGVhcl9vbl91bmhvdmVyfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgIGNvbnN0IGdkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cclxuICAgICAgICBnZC5vbigncGxvdGx5X2NsaWNrJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2tEYXRhID0gZmlsdGVyRXZlbnREYXRhKGdkLCBldmVudERhdGEsICdjbGljaycpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKGNsaWNrRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtjbGlja0RhdGF9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdkLm9uKCdwbG90bHlfY2xpY2thbm5vdGF0aW9uJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2tBbm5vdGF0aW9uRGF0YSA9IG9taXQoXHJcbiAgICAgICAgICAgICAgICBbJ2V2ZW50JywgJ2Z1bGxBbm5vdGF0aW9uJ10sXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGFcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgc2V0UHJvcHMoe2NsaWNrQW5ub3RhdGlvbkRhdGF9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBnZC5vbigncGxvdGx5X2hvdmVyJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaG92ZXJEYXRhID0gZmlsdGVyRXZlbnREYXRhKGdkLCBldmVudERhdGEsICdob3ZlcicpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKGhvdmVyRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtob3ZlckRhdGF9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdkLm9uKCdwbG90bHlfc2VsZWN0ZWQnLCBldmVudERhdGEgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBmaWx0ZXJFdmVudERhdGEoZ2QsIGV2ZW50RGF0YSwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNOaWwoc2VsZWN0ZWREYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgc2V0UHJvcHMoe3NlbGVjdGVkRGF0YX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ2Qub24oJ3Bsb3RseV9kZXNlbGVjdCcsICgpID0+IHtcclxuICAgICAgICAgICAgc2V0UHJvcHMoe3NlbGVjdGVkRGF0YTogbnVsbH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdkLm9uKCdwbG90bHlfcmVsYXlvdXQnLCBldmVudERhdGEgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZWxheW91dERhdGEgPSBmaWx0ZXJFdmVudERhdGEoZ2QsIGV2ZW50RGF0YSwgJ3JlbGF5b3V0Jyk7XHJcbiAgICAgICAgICAgIGlmICghaXNOaWwocmVsYXlvdXREYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgc2V0UHJvcHMoe3JlbGF5b3V0RGF0YX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ2Qub24oJ3Bsb3RseV9yZXN0eWxlJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdHlsZURhdGEgPSBmaWx0ZXJFdmVudERhdGEoZ2QsIGV2ZW50RGF0YSwgJ3Jlc3R5bGUnKTtcclxuICAgICAgICAgICAgaWYgKCFpc05pbChyZXN0eWxlRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtyZXN0eWxlRGF0YX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ2Qub24oJ3Bsb3RseV91bmhvdmVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2xlYXJfb25fdW5ob3Zlcikge1xyXG4gICAgICAgICAgICAgICAgc2V0UHJvcHMoe2hvdmVyRGF0YTogbnVsbH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5wbG90KHRoaXMucHJvcHMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5ncmFwaFJlc2l6ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRFbWl0dGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5ncmFwaFJlc2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaWQgIT09IG5leHRQcm9wcy5pZCB8fFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLnN0eWxlKSAhPT0gSlNPTi5zdHJpbmdpZnkobmV4dFByb3BzLnN0eWxlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcclxuICAgICAgICBjb25zdCBpZENoYW5nZWQgPSB0aGlzLnByb3BzLmlkICE9PSBuZXh0UHJvcHMuaWQ7XHJcbiAgICAgICAgaWYgKGlkQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiB0aGVuIHRoZSBkb20gbmVlZHMgdG8gZ2V0IHJlLXJlbmRlcmVkIHdpdGggYSBuZXcgSUQuXHJcbiAgICAgICAgICAgICAqIHRoZSBncmFwaCB3aWxsIGdldCB1cGRhdGVkIGluIGNvbXBvbmVudERpZFVwZGF0ZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlndXJlQ2hhbmdlZCA9IHRoaXMucHJvcHMuZmlndXJlICE9PSBuZXh0UHJvcHMuZmlndXJlO1xyXG4gICAgICAgIGlmIChmaWd1cmVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGxvdChuZXh0UHJvcHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXh0ZW5kRGF0YUNoYW5nZWQgPVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmV4dGVuZERhdGEgIT09IG5leHRQcm9wcy5leHRlbmREYXRhO1xyXG4gICAgICAgIGlmIChleHRlbmREYXRhQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZChuZXh0UHJvcHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XHJcbiAgICAgICAgaWYgKHByZXZQcm9wcy5pZCAhPT0gdGhpcy5wcm9wcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBsb3QodGhpcy5wcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7Y2xhc3NOYW1lLCBpZCwgc3R5bGUsIGxvYWRpbmdfc3RhdGV9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAga2V5PXtpZH1cclxuICAgICAgICAgICAgICAgIGlkPXtpZH1cclxuICAgICAgICAgICAgICAgIGRhdGEtZGFzaC1pcy1sb2FkaW5nPXtcclxuICAgICAgICAgICAgICAgICAgICAobG9hZGluZ19zdGF0ZSAmJiBsb2FkaW5nX3N0YXRlLmlzX2xvYWRpbmcpIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgZ3JhcGhQcm9wVHlwZXMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBJRCBvZiB0aGlzIGNvbXBvbmVudCwgdXNlZCB0byBpZGVudGlmeSBkYXNoIGNvbXBvbmVudHNcclxuICAgICAqIGluIGNhbGxiYWNrcy4gVGhlIElEIG5lZWRzIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIG9mIHRoZVxyXG4gICAgICogY29tcG9uZW50cyBpbiBhbiBhcHAuXHJcbiAgICAgKi9cclxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGZyb20gbGF0ZXN0IGNsaWNrIGV2ZW50LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIGNsaWNrRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgZnJvbSBsYXRlc3QgY2xpY2sgYW5ub3RhdGlvbiBldmVudC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBjbGlja0Fubm90YXRpb25EYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBmcm9tIGxhdGVzdCBob3ZlciBldmVudC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBob3ZlckRhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBUcnVlLCBgY2xlYXJfb25fdW5ob3ZlcmAgd2lsbCBjbGVhciB0aGUgYGhvdmVyRGF0YWAgcHJvcGVydHlcclxuICAgICAqIHdoZW4gdGhlIHVzZXIgXCJ1bmhvdmVyc1wiIGZyb20gYSBwb2ludC5cclxuICAgICAqIElmIEZhbHNlLCB0aGVuIHRoZSBgaG92ZXJEYXRhYCBwcm9wZXJ0eSB3aWxsIGJlIGVxdWFsIHRvIHRoZVxyXG4gICAgICogZGF0YSBmcm9tIHRoZSBsYXN0IHBvaW50IHRoYXQgd2FzIGhvdmVyZWQgb3Zlci5cclxuICAgICAqL1xyXG4gICAgY2xlYXJfb25fdW5ob3ZlcjogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGZyb20gbGF0ZXN0IHNlbGVjdCBldmVudC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBzZWxlY3RlZERhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGZyb20gbGF0ZXN0IHJlbGF5b3V0IGV2ZW50IHdoaWNoIG9jY3Vyc1xyXG4gICAgICogd2hlbiB0aGUgdXNlciB6b29tcyBvciBwYW5zIG9uIHRoZSBwbG90IG9yIG90aGVyXHJcbiAgICAgKiBsYXlvdXQtbGV2ZWwgZWRpdHMuIEhhcyB0aGUgZm9ybSBgezxhdHRyIHN0cmluZz46IDx2YWx1ZT59YFxyXG4gICAgICogZGVzY3JpYmluZyB0aGUgY2hhbmdlcyBtYWRlLiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHJlbGF5b3V0RGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdGhhdCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gZXhpc3RpbmcgdHJhY2VzLiBIYXMgdGhlIGZvcm1cclxuICAgICAqIGBbdXBkYXRlRGF0YSwgdHJhY2VJbmRpY2VzLCBtYXhQb2ludHNdYCwgd2hlcmUgYHVwZGF0ZURhdGFgIGlzIGFuIGFycmF5XHJcbiAgICAgKiBjb250YWluaW5nIGRhdGEgb2JqZWN0cyB0byBleHRlbmQsIGB0cmFjZUluZGljZXNgIChvcHRpb25hbCkgaXMgYW4gYXJyYXlcclxuICAgICAqIG9mIHRyYWNlIGluZGljZXMgdGhhdCBzaG91bGQgYmUgZXh0ZW5kZWQsIGFuZCBgbWF4UG9pbnRzYCAob3B0aW9uYWwpIGlzXHJcbiAgICAgKiBlaXRoZXIgYW4gaW50ZWdlciBkZWZpbmluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGFsbG93ZWQgb3IgYW5cclxuICAgICAqIG9iamVjdCB3aXRoIGtleTp2YWx1ZSBwYWlycyBtYXRjaGluZyBgdXBkYXRlRGF0YWBcclxuICAgICAqIFJlZmVyZW5jZSB0aGUgUGxvdGx5LmV4dGVuZFRyYWNlcyBBUEkgZm9yIGZ1bGwgdXNhZ2U6XHJcbiAgICAgKiBodHRwczovL3Bsb3QubHkvamF2YXNjcmlwdC9wbG90bHlqcy1mdW5jdGlvbi1yZWZlcmVuY2UvI3Bsb3RseWV4dGVuZHRyYWNlc1xyXG4gICAgICovXHJcbiAgICBleHRlbmREYXRhOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5vYmplY3RdKSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgZnJvbSBsYXRlc3QgcmVzdHlsZSBldmVudCB3aGljaCBvY2N1cnNcclxuICAgICAqIHdoZW4gdGhlIHVzZXIgdG9nZ2xlcyBhIGxlZ2VuZCBpdGVtLCBjaGFuZ2VzXHJcbiAgICAgKiBwYXJjb29yZHMgc2VsZWN0aW9ucywgb3Igb3RoZXIgdHJhY2UtbGV2ZWwgZWRpdHMuXHJcbiAgICAgKiBIYXMgdGhlIGZvcm0gYFtlZGl0cywgaW5kaWNlc11gLCB3aGVyZSBgZWRpdHNgIGlzIGFuIG9iamVjdFxyXG4gICAgICogYHs8YXR0ciBzdHJpbmc+OiA8dmFsdWU+fWAgZGVzY3JpYmluZyB0aGUgY2hhbmdlcyBtYWRlLFxyXG4gICAgICogYW5kIGBpbmRpY2VzYCBpcyBhbiBhcnJheSBvZiB0cmFjZSBpbmRpY2VzIHRoYXQgd2VyZSBlZGl0ZWQuXHJcbiAgICAgKiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHJlc3R5bGVEYXRhOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQbG90bHkgYGZpZ3VyZWAgb2JqZWN0LiBTZWUgc2NoZW1hOlxyXG4gICAgICogaHR0cHM6Ly9wbG90Lmx5L2phdmFzY3JpcHQvcmVmZXJlbmNlXHJcbiAgICAgKlxyXG4gICAgICogYGNvbmZpZ2AgaXMgc2V0IHNlcGFyYXRlbHkgYnkgdGhlIGBjb25maWdgIHByb3BlcnR5XHJcbiAgICAgKi9cclxuICAgIGZpZ3VyZTogUHJvcFR5cGVzLmV4YWN0KHtcclxuICAgICAgICBkYXRhOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcclxuICAgICAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXHJcbiAgICAgICAgZnJhbWVzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcclxuICAgIH0pLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJpYyBzdHlsZSBvdmVycmlkZXMgb24gdGhlIHBsb3QgZGl2XHJcbiAgICAgKi9cclxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY2xhc3NOYW1lIG9mIHRoZSBwYXJlbnQgZGl2XHJcbiAgICAgKi9cclxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJldGE6IElmIHRydWUsIGFuaW1hdGUgYmV0d2VlbiB1cGRhdGVzIHVzaW5nXHJcbiAgICAgKiBwbG90bHkuanMncyBgYW5pbWF0ZWAgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgYW5pbWF0ZTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZXRhOiBPYmplY3QgY29udGFpbmluZyBhbmltYXRpb24gc2V0dGluZ3MuXHJcbiAgICAgKiBPbmx5IGFwcGxpZXMgaWYgYGFuaW1hdGVgIGlzIGB0cnVlYFxyXG4gICAgICovXHJcbiAgICBhbmltYXRpb25fb3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBsb3RseS5qcyBjb25maWcgb3B0aW9ucy5cclxuICAgICAqIFNlZSBodHRwczovL3Bsb3QubHkvamF2YXNjcmlwdC9jb25maWd1cmF0aW9uLW9wdGlvbnMvXHJcbiAgICAgKiBmb3IgbW9yZSBpbmZvLlxyXG4gICAgICovXHJcbiAgICBjb25maWc6IFByb3BUeXBlcy5leGFjdCh7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTm8gaW50ZXJhY3Rpdml0eSwgZm9yIGV4cG9ydCBvciBpbWFnZSBnZW5lcmF0aW9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3RhdGljUGxvdDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJhc2UgVVJMIGZvciBhIFBsb3RseSBjbG91ZCBpbnN0YW5jZSwgaWYgYHNob3dTZW5kVG9DbG91ZGAgaXMgZW5hYmxlZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBsb3RseVNlcnZlclVSTDogUHJvcFR5cGVzLnN0cmluZyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2UgY2FuIGVkaXQgdGl0bGVzLCBtb3ZlIGFubm90YXRpb25zLCBldGMgLSBzZXRzIGFsbCBwaWVjZXMgb2YgYGVkaXRzYFxyXG4gICAgICAgICAqIHVubGVzcyBhIHNlcGFyYXRlIGBlZGl0c2AgY29uZmlnIGl0ZW0gb3ZlcnJpZGVzIGluZGl2aWR1YWwgcGFydHNcclxuICAgICAgICAgKi9cclxuICAgICAgICBlZGl0YWJsZTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2V0IG9mIGVkaXRhYmxlIHByb3BlcnRpZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICBlZGl0czogUHJvcFR5cGVzLmV4YWN0KHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIGFubm90YXRpb25Qb3NpdGlvbjogdGhlIG1haW4gYW5jaG9yIG9mIHRoZSBhbm5vdGF0aW9uLCB3aGljaCBpcyB0aGVcclxuICAgICAgICAgICAgICogdGV4dCAoaWYgbm8gYXJyb3cpIG9yIHRoZSBhcnJvdyAod2hpY2ggZHJhZ3MgdGhlIHdob2xlIHRoaW5nIGxlYXZpbmdcclxuICAgICAgICAgICAgICogdGhlIGFycm93IGxlbmd0aCAmIGRpcmVjdGlvbiB1bmNoYW5nZWQpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBhbm5vdGF0aW9uUG9zaXRpb246IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEp1c3QgZm9yIGFubm90YXRpb25zIHdpdGggYXJyb3dzLCBjaGFuZ2UgdGhlIGxlbmd0aCBhbmQgZGlyZWN0aW9uIG9mIHRoZSBhcnJvd1xyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgYW5ub3RhdGlvblRhaWw6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgYW5ub3RhdGlvblRleHQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgYXhpc1RpdGxlVGV4dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgICAgICBjb2xvcmJhclBvc2l0aW9uOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIGNvbG9yYmFyVGl0bGVUZXh0OiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBFZGl0IHRoZSB0cmFjZSBuYW1lIGZpZWxkcyBmcm9tIHRoZSBsZWdlbmRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxlZ2VuZFRleHQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgc2hhcGVQb3NpdGlvbjogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIGdsb2JhbCBgbGF5b3V0LnRpdGxlYFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGl0bGVUZXh0OiBQcm9wVHlwZXMuYm9vbCxcclxuICAgICAgICB9KSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRE8gYXV0b3NpemUgb25jZSByZWdhcmRsZXNzIG9mIGxheW91dC5hdXRvc2l6ZVxyXG4gICAgICAgICAqICh1c2UgZGVmYXVsdCB3aWR0aCBvciBoZWlnaHQgdmFsdWVzIG90aGVyd2lzZSlcclxuICAgICAgICAgKi9cclxuICAgICAgICBhdXRvc2l6YWJsZTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdG8gY2hhbmdlIGxheW91dCBzaXplIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXNwb25zaXZlOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIHVuZG8vcmVkbyBxdWV1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHF1ZXVlTGVuZ3RoOiBQcm9wVHlwZXMubnVtYmVyLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB3ZSBETyBhdXRvc2l6ZSwgZG8gd2UgZmlsbCB0aGUgY29udGFpbmVyIG9yIHRoZSBzY3JlZW4/XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZmlsbEZyYW1lOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgd2UgRE8gYXV0b3NpemUsIHNldCB0aGUgZnJhbWUgbWFyZ2lucyBpbiBwZXJjZW50cyBvZiBwbG90IHNpemVcclxuICAgICAgICAgKi9cclxuICAgICAgICBmcmFtZU1hcmdpbnM6IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vdXNld2hlZWwgb3IgdHdvLWZpbmdlciBzY3JvbGwgem9vbXMgdGhlIHBsb3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBzY3JvbGxab29tOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG91YmxlIGNsaWNrIGludGVyYWN0aW9uIChmYWxzZSwgJ3Jlc2V0JywgJ2F1dG9zaXplJyBvciAncmVzZXQrYXV0b3NpemUnKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRvdWJsZUNsaWNrOiBQcm9wVHlwZXMub25lT2YoW1xyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgJ3Jlc2V0JyxcclxuICAgICAgICAgICAgJ2F1dG9zaXplJyxcclxuICAgICAgICAgICAgJ3Jlc2V0K2F1dG9zaXplJyxcclxuICAgICAgICBdKSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTmV3IHVzZXJzIHNlZSBzb21lIGhpbnRzIGFib3V0IGludGVyYWN0aXZpdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93VGlwczogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEVuYWJsZSBheGlzIHBhbi96b29tIGRyYWcgaGFuZGxlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dBeGlzRHJhZ0hhbmRsZXM6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFbmFibGUgZGlyZWN0IHJhbmdlIGVudHJ5IGF0IHRoZSBwYW4vem9vbSBkcmFnIHBvaW50c1xyXG4gICAgICAgICAqIChkcmFnIGhhbmRsZXMgbXVzdCBiZSBlbmFibGVkIGFib3ZlKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dBeGlzUmFuZ2VFbnRyeUJveGVzOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTGluayB0byBvcGVuIHRoaXMgcGxvdCBpbiBwbG90bHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93TGluazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHdlIHNob3cgYSBsaW5rLCBkb2VzIGl0IGNvbnRhaW4gZGF0YSBvciBqdXN0IGxpbmsgdG8gYSBwbG90bHkgZmlsZT9cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZW5kRGF0YTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRleHQgYXBwZWFyaW5nIGluIHRoZSBzZW5kRGF0YSBsaW5rXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbGlua1RleHQ6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERpc3BsYXkgdGhlIG1vZGUgYmFyICh0cnVlLCBmYWxzZSwgb3IgJ2hvdmVyJylcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaXNwbGF5TW9kZUJhcjogUHJvcFR5cGVzLm9uZU9mKFt0cnVlLCBmYWxzZSwgJ2hvdmVyJ10pLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTaG91bGQgd2UgaW5jbHVkZSBhIG1vZGViYXIgYnV0dG9uIHRvIHNlbmQgdGhpcyBkYXRhIHRvIGFcclxuICAgICAgICAgKiBQbG90bHkgQ2xvdWQgaW5zdGFuY2UsIGxpbmtlZCBieSBgcGxvdGx5U2VydmVyVVJMYC5cclxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoaXMgaXMgZmFsc2UuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd1NlbmRUb0Nsb3VkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIG1vZGUgYmFyIGJ1dHRvbiBieSBuYW1lLlxyXG4gICAgICAgICAqIEFsbCBtb2RlYmFyIGJ1dHRvbiBuYW1lcyBhdCBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9ibG9iL21hc3Rlci9zcmMvY29tcG9uZW50cy9tb2RlYmFyL2J1dHRvbnMuanNcclxuICAgICAgICAgKiBDb21tb24gbmFtZXMgaW5jbHVkZTpcclxuICAgICAgICAgKiAgLSBzZW5kRGF0YVRvQ2xvdWRcclxuICAgICAgICAgKiAtICgyRCk6IHpvb20yZCwgcGFuMmQsIHNlbGVjdDJkLCBsYXNzbzJkLCB6b29tSW4yZCwgem9vbU91dDJkLCBhdXRvU2NhbGUyZCwgcmVzZXRTY2FsZTJkXHJcbiAgICAgICAgICogLSAoQ2FydGVzaWFuKTogaG92ZXJDbG9zZXN0Q2FydGVzaWFuLCBob3ZlckNvbXBhcmVDYXJ0ZXNpYW5cclxuICAgICAgICAgKiAtICgzRCk6IHpvb20zZCwgcGFuM2QsIG9yYml0Um90YXRpb24sIHRhYmxlUm90YXRpb24sIGhhbmRsZURyYWczZCwgcmVzZXRDYW1lcmFEZWZhdWx0M2QsIHJlc2V0Q2FtZXJhTGFzdFNhdmUzZCwgaG92ZXJDbG9zZXN0M2RcclxuICAgICAgICAgKiAtIChHZW8pOiB6b29tSW5HZW8sIHpvb21PdXRHZW8sIHJlc2V0R2VvLCBob3ZlckNsb3Nlc3RHZW9cclxuICAgICAgICAgKiAtIGhvdmVyQ2xvc2VzdEdsMmQsIGhvdmVyQ2xvc2VzdFBpZSwgdG9nZ2xlSG92ZXIsIHJlc2V0Vmlld3NcclxuICAgICAgICAgKi9cclxuICAgICAgICBtb2RlQmFyQnV0dG9uc1RvUmVtb3ZlOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFkZCBtb2RlIGJhciBidXR0b24gdXNpbmcgY29uZmlnIG9iamVjdHNcclxuICAgICAgICAgKi9cclxuICAgICAgICBtb2RlQmFyQnV0dG9uc1RvQWRkOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZ1bGx5IGN1c3RvbSBtb2RlIGJhciBidXR0b25zIGFzIG5lc3RlZCBhcnJheSxcclxuICAgICAgICAgKiB3aGVyZSB0aGUgb3V0ZXIgYXJyYXlzIHJlcHJlc2VudHMgYnV0dG9uIGdyb3VwcywgYW5kXHJcbiAgICAgICAgICogdGhlIGlubmVyIGFycmF5cyBoYXZlIGJ1dHRvbnMgY29uZmlnIG9iamVjdHMgb3IgbmFtZXMgb2YgZGVmYXVsdCBidXR0b25zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbW9kZUJhckJ1dHRvbnM6IFByb3BUeXBlcy5hbnksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vZGlmaWNhdGlvbnMgdG8gaG93IHRoZSB0b0ltYWdlIG1vZGViYXIgYnV0dG9uIHdvcmtzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9JbWFnZUJ1dHRvbk9wdGlvbnM6IFByb3BUeXBlcy5leGFjdCh7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBUaGUgZmlsZSBmb3JtYXQgdG8gY3JlYXRlXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBmb3JtYXQ6IFByb3BUeXBlcy5vbmVPZihbJ2pwZWcnLCAncG5nJywgJ3dlYnAnLCAnc3ZnJ10pLFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIGRvd25sb2FkZWQgZmlsZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZmlsZW5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBXaWR0aCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlLCBpbiBweFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBIZWlnaHQgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSwgaW4gcHhcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGhlaWdodDogUHJvcFR5cGVzLm51bWJlcixcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEV4dHJhIHJlc29sdXRpb24gdG8gZ2l2ZSB0aGUgZmlsZSBhZnRlclxyXG4gICAgICAgICAgICAgKiByZW5kZXJpbmcgaXQgd2l0aCB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgc2NhbGU6IFByb3BUeXBlcy5udW1iZXIsXHJcbiAgICAgICAgfSksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFkZCB0aGUgcGxvdGx5IGxvZ28gb24gdGhlIGVuZCBvZiB0aGUgbW9kZSBiYXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaXNwbGF5bG9nbzogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFkZCB0aGUgcGxvdGx5IGxvZ28gZXZlbiB3aXRoIG5vIG1vZGViYXJcclxuICAgICAgICAgKi9cclxuICAgICAgICB3YXRlcm1hcms6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmNyZWFzZSB0aGUgcGl4ZWwgcmF0aW8gZm9yIEdsIHBsb3QgaW1hZ2VzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGxvdEdsUGl4ZWxSYXRpbzogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVVJMIHRvIHRvcG9qc29uIGZpbGVzIHVzZWQgaW4gZ2VvIGNoYXJ0c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvcG9qc29uVVJMOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNYXBib3ggYWNjZXNzIHRva2VuIChyZXF1aXJlZCB0byBwbG90IG1hcGJveCB0cmFjZSB0eXBlcylcclxuICAgICAgICAgKiBJZiB1c2luZyBhbiBNYXBib3ggQXRsYXMgc2VydmVyLCBzZXQgdGhpcyBvcHRpb24gdG8gJycsXHJcbiAgICAgICAgICogc28gdGhhdCBwbG90bHkuanMgd29uJ3QgYXR0ZW1wdCB0byBhdXRoZW50aWNhdGUgdG8gdGhlIHB1YmxpYyBNYXBib3ggc2VydmVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1hcGJveEFjY2Vzc1Rva2VuOiBQcm9wVHlwZXMuYW55LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9jYWxlIHRvIHVzZS4gTG9jYWxlcyBtYXkgYmUgcHJvdmlkZWQgd2l0aCB0aGUgcGxvdFxyXG4gICAgICAgICAqIChgbG9jYWxlc2AgYmVsb3cpIG9yIGJ5IGxvYWRpbmcgdGhlbSBvbiB0aGUgcGFnZSwgc2VlOlxyXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvcGxvdGx5LmpzL2Jsb2IvbWFzdGVyL2Rpc3QvUkVBRE1FLm1kI3RvLWluY2x1ZGUtbG9jYWxpemF0aW9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbG9jYWxlOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBMb2NhbGl6YXRpb24gZGVmaW5pdGlvbnMsIGlmIHlvdSBjaG9vc2UgdG8gcHJvdmlkZSB0aGVtIHdpdGggdGhlXHJcbiAgICAgICAgICogcGxvdCByYXRoZXIgdGhhbiByZWdpc3RlcmluZyB0aGVtIGdsb2JhbGx5LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxvY2FsZXM6IFByb3BUeXBlcy5vYmplY3QsXHJcbiAgICB9KSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRoYXQgdXBkYXRlcyB0aGUgc3RhdGUgdHJlZS5cclxuICAgICAqL1xyXG4gICAgc2V0UHJvcHM6IFByb3BUeXBlcy5mdW5jLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JqZWN0IHRoYXQgaG9sZHMgdGhlIGxvYWRpbmcgc3RhdGUgb2JqZWN0IGNvbWluZyBmcm9tIGRhc2gtcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgbG9hZGluZ19zdGF0ZTogUHJvcFR5cGVzLnNoYXBlKHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb21wb25lbnQgaXMgbG9hZGluZyBvciBub3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBpc19sb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb2xkcyB3aGljaCBwcm9wZXJ0eSBpcyBsb2FkaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcHJvcF9uYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvbGRzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyBsb2FkaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29tcG9uZW50X25hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICB9KSxcclxufTtcclxuXHJcbmNvbnN0IGdyYXBoRGVmYXVsdFByb3BzID0ge1xyXG4gICAgY2xpY2tEYXRhOiBudWxsLFxyXG4gICAgY2xpY2tBbm5vdGF0aW9uRGF0YTogbnVsbCxcclxuICAgIGhvdmVyRGF0YTogbnVsbCxcclxuICAgIHNlbGVjdGVkRGF0YTogbnVsbCxcclxuICAgIHJlbGF5b3V0RGF0YTogbnVsbCxcclxuICAgIGV4dGVuZERhdGE6IG51bGwsXHJcbiAgICByZXN0eWxlRGF0YTogbnVsbCxcclxuICAgIGZpZ3VyZToge2RhdGE6IFtdLCBsYXlvdXQ6IHt9LCBmcmFtZXM6IFtdfSxcclxuICAgIGFuaW1hdGU6IGZhbHNlLFxyXG4gICAgYW5pbWF0aW9uX29wdGlvbnM6IHtcclxuICAgICAgICBmcmFtZToge1xyXG4gICAgICAgICAgICByZWRyYXc6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNpdGlvbjoge1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogNzUwLFxyXG4gICAgICAgICAgICBlYXNlOiAnY3ViaWMtaW4tb3V0JyxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIGNsZWFyX29uX3VuaG92ZXI6IGZhbHNlLFxyXG4gICAgY29uZmlnOiB7fSxcclxufTtcclxuXHJcbkV4dGVuZGFibGVHcmFwaFdpdGhEZWZhdWx0cy5wcm9wVHlwZXMgPSBncmFwaFByb3BUeXBlcztcclxuRXh0ZW5kYWJsZUdyYXBoLnByb3BUeXBlcyA9IGdyYXBoUHJvcFR5cGVzO1xyXG5cclxuRXh0ZW5kYWJsZUdyYXBoV2l0aERlZmF1bHRzLmRlZmF1bHRQcm9wcyA9IGdyYXBoRGVmYXVsdFByb3BzO1xyXG5FeHRlbmRhYmxlR3JhcGguZGVmYXVsdFByb3BzID0gZ3JhcGhEZWZhdWx0UHJvcHM7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFeHRlbmRhYmxlR3JhcGhXaXRoRGVmYXVsdHM7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/components/ExtendableGraph.react.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"prop-types\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ \"./node_modules/ramda/es/index.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\n\n/* global Plotly:true */\n\nvar filterEventData = function filterEventData(gd, eventData, event) {\n var filteredEventData;\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"contains\"])(event, ['click', 'hover', 'selected'])) {\n var points = [];\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(eventData)) {\n return null;\n }\n /*\r\n * remove `data`, `layout`, `xaxis`, etc\r\n * objects from the event data since they're so big\r\n * and cause JSON stringify ciricular structure errors.\r\n *\r\n * also, pull down the `customdata` point from the data array\r\n * into the event object\r\n */\n\n\n var data = gd.data;\n\n for (var i = 0; i < eventData.points.length; i++) {\n var fullPoint = eventData.points[i];\n var pointData = Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"filter\"])(function (o) {\n return !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"contains\"])(Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"type\"])(o), ['Object', 'Array']);\n }, fullPoint);\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('curveNumber', fullPoint) && Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('pointNumber', fullPoint) && Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('customdata', data[pointData.curveNumber])) {\n pointData.customdata = data[pointData.curveNumber].customdata[fullPoint.pointNumber];\n } // specific to histogram. see https://github.com/plotly/plotly.js/pull/2113/\n\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('pointNumbers', fullPoint)) {\n pointData.pointNumbers = fullPoint.pointNumbers;\n }\n\n points[i] = pointData;\n }\n\n filteredEventData = {\n points: points\n };\n } else if (event === 'relayout' || event === 'restyle') {\n /*\r\n * relayout shouldn't include any big objects\r\n * it will usually just contain the ranges of the axes like\r\n * \"xaxis.range[0]\": 0.7715822247381828,\r\n * \"xaxis.range[1]\": 3.0095292008680063`\r\n */\n filteredEventData = eventData;\n }\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('range', eventData)) {\n filteredEventData.range = eventData.range;\n }\n\n if (Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"has\"])('lassoPoints', eventData)) {\n filteredEventData.lassoPoints = eventData.lassoPoints;\n }\n\n return filteredEventData;\n};\n/**\r\n * ExtendableGraph can be used to render any plotly.js-powered data vis.\r\n *\r\n * You can define callbacks based on user interaction with ExtendableGraphs such\r\n * as hovering, clicking or selecting\r\n */\n\n\nvar ExtendableGraph =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(ExtendableGraph, _Component);\n\n function ExtendableGraph(props) {\n var _this;\n\n _classCallCheck(this, ExtendableGraph);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ExtendableGraph).call(this, props));\n _this.gd = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef();\n _this.bindEvents = _this.bindEvents.bind(_assertThisInitialized(_this));\n _this._hasPlotted = false;\n _this._prevGd = null;\n _this.graphResize = _this.graphResize.bind(_assertThisInitialized(_this));\n return _this;\n }\n\n _createClass(ExtendableGraph, [{\n key: \"plot\",\n value: function plot(props) {\n var _this2 = this;\n\n var figure = props.figure,\n animate = props.animate,\n animation_options = props.animation_options,\n config = props.config;\n var gd = this.gd.current;\n\n if (animate && this._hasPlotted && figure.data.length === gd.data.length) {\n return Plotly.animate(gd, figure, animation_options);\n }\n\n return Plotly.react(gd, {\n data: figure.data,\n layout: Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"clone\"])(figure.layout),\n frames: figure.frames,\n config: config\n }).then(function () {\n var gd = _this2.gd.current; // double-check gd hasn't been unmounted\n\n if (!gd) {\n return;\n } // in case we've made a new DOM element, transfer events\n\n\n if (_this2._hasPlotted && gd !== _this2._prevGd) {\n if (_this2._prevGd && _this2._prevGd.removeAllListeners) {\n _this2._prevGd.removeAllListeners();\n\n Plotly.purge(_this2._prevGd);\n }\n\n _this2._hasPlotted = false;\n }\n\n if (!_this2._hasPlotted) {\n _this2.bindEvents();\n\n Plotly.Plots.resize(gd);\n _this2._hasPlotted = true;\n _this2._prevGd = gd;\n }\n });\n }\n }, {\n key: \"extend\",\n value: function extend(props) {\n var extendData = props.extendData;\n var gd = this.gd.current;\n var updateData, traceIndices, maxPoints;\n\n if (extendData) {\n var createDataObject = function createDataObject(data) {\n var dataprops = Object.keys(data);\n var ret = {};\n\n for (var i = 0; i < dataprops.length; i++) {\n ret[dataprops[i]] = [data[dataprops[i]]];\n }\n\n return ret;\n };\n\n if (gd.data.length < 1) {\n // figure has no pre-existing data. redirect to plot()\n props.figure.data = extendData;\n return this.plot(props);\n }\n\n if (Array.isArray(extendData) && Array.isArray(extendData[0])) {\n var _extendData = _slicedToArray(extendData, 3);\n\n updateData = _extendData[0];\n traceIndices = _extendData[1];\n maxPoints = _extendData[2];\n } else {\n updateData = extendData;\n }\n\n if (!traceIndices) {\n traceIndices = Array.from(Array(updateData.length).keys());\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = updateData.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _step$value = _slicedToArray(_step.value, 2),\n i = _step$value[0],\n value = _step$value[1];\n\n var updateObject = createDataObject(value);\n\n if (i < updateData.length - 1) {\n if (traceIndices[i] < gd.data.length) {\n Plotly.extendTraces(gd, updateObject, [traceIndices[i]], maxPoints);\n } else {\n Plotly.addTraces(gd, value);\n }\n } else {\n if (traceIndices[i] < gd.data.length) {\n return Plotly.extendTraces(gd, updateObject, [traceIndices[i]], maxPoints);\n }\n\n return Plotly.addTraces(gd, value);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) {\n _iterator[\"return\"]();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n\n return this.plot(props);\n }\n }, {\n key: \"graphResize\",\n value: function graphResize() {\n var gd = this.gd.current;\n\n if (gd) {\n Plotly.Plots.resize(gd);\n }\n }\n }, {\n key: \"bindEvents\",\n value: function bindEvents() {\n var _this$props = this.props,\n setProps = _this$props.setProps,\n clear_on_unhover = _this$props.clear_on_unhover,\n relayoutData = _this$props.relayoutData,\n restyleData = _this$props.restyleData,\n hoverData = _this$props.hoverData,\n selectedData = _this$props.selectedData;\n var gd = this.gd.current;\n gd.on('plotly_click', function (eventData) {\n var clickData = filterEventData(gd, eventData, 'click');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(clickData)) {\n setProps({\n clickData: clickData\n });\n }\n });\n gd.on('plotly_clickannotation', function (eventData) {\n var clickAnnotationData = Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"omit\"])(['event', 'fullAnnotation'], eventData);\n setProps({\n clickAnnotationData: clickAnnotationData\n });\n });\n gd.on('plotly_hover', function (eventData) {\n var hover = filterEventData(gd, eventData, 'hover');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(hover) && !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"equals\"])(hover, hoverData)) {\n setProps({\n hoverData: hover\n });\n }\n });\n gd.on('plotly_selected', function (eventData) {\n var selected = filterEventData(gd, eventData, 'selected');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(selected) && !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"equals\"])(selected, selectedData)) {\n setProps({\n selectedData: selected\n });\n }\n });\n gd.on('plotly_deselect', function () {\n setProps({\n selectedData: null\n });\n });\n gd.on('plotly_relayout', function (eventData) {\n var relayout = filterEventData(gd, eventData, 'relayout');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(relayout) && !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"equals\"])(relayout, relayoutData)) {\n setProps({\n relayoutData: relayout\n });\n }\n });\n gd.on('plotly_restyle', function (eventData) {\n var restyle = filterEventData(gd, eventData, 'restyle');\n\n if (!Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"isNil\"])(restyle) && !Object(ramda__WEBPACK_IMPORTED_MODULE_2__[\"equals\"])(restyle, restyleData)) {\n setProps({\n restyleData: restyle\n });\n }\n });\n gd.on('plotly_unhover', function () {\n if (clear_on_unhover) {\n setProps({\n hoverData: null\n });\n }\n });\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this3 = this;\n\n this.plot(this.props).then(function () {\n window.addEventListener('resize', _this3.graphResize);\n });\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n var gd = this.gd.current;\n\n if (gd && gd.removeAllListeners) {\n gd.removeAllListeners();\n Plotly.purge(gd);\n }\n\n window.removeEventListener('resize', this.graphResize);\n }\n }, {\n key: \"shouldComponentUpdate\",\n value: function shouldComponentUpdate(nextProps) {\n return this.props.id !== nextProps.id || JSON.stringify(this.props.style) !== JSON.stringify(nextProps.style);\n }\n }, {\n key: \"componentWillReceiveProps\",\n value: function componentWillReceiveProps(nextProps) {\n var idChanged = this.props.id !== nextProps.id;\n\n if (idChanged) {\n /*\r\n * then the dom needs to get re-rendered with a new ID.\r\n * the graph will get updated in componentDidUpdate\r\n */\n return;\n }\n\n var figureChanged = this.props.figure !== nextProps.figure;\n\n if (figureChanged) {\n this.plot(nextProps);\n }\n\n var extendDataChanged = this.props.extendData !== nextProps.extendData;\n\n if (extendDataChanged) {\n this.extend(nextProps);\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n if (prevProps.id !== this.props.id) {\n this.plot(this.props);\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n id = _this$props2.id,\n style = _this$props2.style,\n loading_state = _this$props2.loading_state;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n key: id,\n id: id,\n ref: this.gd,\n \"data-dash-is-loading\": loading_state && loading_state.is_loading || undefined,\n style: style,\n className: className\n });\n }\n }]);\n\n return ExtendableGraph;\n}(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\nvar graphPropTypes = {\n /**\r\n * The ID of this component, used to identify dash components\r\n * in callbacks. The ID needs to be unique across all of the\r\n * components in an app.\r\n */\n id: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Data from latest click event. Read-only.\r\n */\n clickData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest click annotation event. Read-only.\r\n */\n clickAnnotationData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest hover event. Read-only.\r\n */\n hoverData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * If True, `clear_on_unhover` will clear the `hoverData` property\r\n * when the user \"unhovers\" from a point.\r\n * If False, then the `hoverData` property will be equal to the\r\n * data from the last point that was hovered over.\r\n */\n clear_on_unhover: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Data from latest select event. Read-only.\r\n */\n selectedData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data from latest relayout event which occurs\r\n * when the user zooms or pans on the plot or other\r\n * layout-level edits. Has the form `{: }`\r\n * describing the changes made. Read-only.\r\n */\n relayoutData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Data that should be appended to existing traces. Has the form\r\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an array\r\n * containing data objects to extend, `traceIndices` (optional) is an array\r\n * of trace indices that should be extended, and `maxPoints` (optional) is\r\n * either an integer defining the maximum number of points allowed or an\r\n * object with key:value pairs matching `updateData`\r\n * Reference the Plotly.extendTraces API for full usage:\r\n * https://plot.ly/javascript/plotlyjs-function-reference/#plotlyextendtraces\r\n */\n extendData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]),\n\n /**\r\n * Data from latest restyle event which occurs\r\n * when the user toggles a legend item, changes\r\n * parcoords selections, or other trace-level edits.\r\n * Has the form `[edits, indices]`, where `edits` is an object\r\n * `{: }` describing the changes made,\r\n * and `indices` is an array of trace indices that were edited.\r\n * Read-only.\r\n */\n restyleData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Plotly `figure` object. See schema:\r\n * https://plot.ly/javascript/reference\r\n *\r\n * `config` is set separately by the `config` property\r\n */\n figure: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object),\n layout: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n frames: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object)\n }),\n\n /**\r\n * Generic style overrides on the plot div\r\n */\n style: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * className of the parent div\r\n */\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Beta: If true, animate between updates using\r\n * plotly.js's `animate` function\r\n */\n animate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Beta: Object containing animation settings.\r\n * Only applies if `animate` is `true`\r\n */\n animation_options: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n\n /**\r\n * Plotly.js config options.\r\n * See https://plot.ly/javascript/configuration-options/\r\n * for more info.\r\n */\n config: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * No interactivity, for export or image generation\r\n */\n staticPlot: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Base URL for a Plotly cloud instance, if `showSendToCloud` is enabled\r\n */\n plotlyServerURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * We can edit titles, move annotations, etc - sets all pieces of `edits`\r\n * unless a separate `edits` config item overrides individual parts\r\n */\n editable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * A set of editable properties\r\n */\n edits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * The main anchor of the annotation, which is the\r\n * text (if no arrow) or the arrow (which drags the whole thing leaving\r\n * the arrow length & direction unchanged)\r\n */\n annotationPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Just for annotations with arrows, change the length and direction of the arrow\r\n */\n annotationTail: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n annotationText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n axisTitleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n colorbarPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n colorbarTitleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n legendPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Edit the trace name fields from the legend\r\n */\n legendText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n shapePosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * The global `layout.title`\r\n */\n titleText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n }),\n\n /**\r\n * DO autosize once regardless of layout.autosize\r\n * (use default width or height values otherwise)\r\n */\n autosizable: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Whether to change layout size when the window size changes\r\n */\n responsive: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Set the length of the undo/redo queue\r\n */\n queueLength: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * If we DO autosize, do we fill the container or the screen?\r\n */\n fillFrame: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * If we DO autosize, set the frame margins in percents of plot size\r\n */\n frameMargins: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Mousewheel or two-finger scroll zooms the plot\r\n */\n scrollZoom: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Double click interaction (false, 'reset', 'autosize' or 'reset+autosize')\r\n */\n doubleClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([false, 'reset', 'autosize', 'reset+autosize']),\n\n /**\r\n * New users see some hints about interactivity\r\n */\n showTips: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Enable axis pan/zoom drag handles\r\n */\n showAxisDragHandles: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Enable direct range entry at the pan/zoom drag points\r\n * (drag handles must be enabled above)\r\n */\n showAxisRangeEntryBoxes: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Link to open this plot in plotly\r\n */\n showLink: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * If we show a link, does it contain data or just link to a plotly file?\r\n */\n sendData: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Text appearing in the sendData link\r\n */\n linkText: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Display the mode bar (true, false, or 'hover')\r\n */\n displayModeBar: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([true, false, 'hover']),\n\n /**\r\n * Should we include a modebar button to send this data to a\r\n * Plotly Cloud instance, linked by `plotlyServerURL`.\r\n * By default this is false.\r\n */\n showSendToCloud: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Remove mode bar button by name.\r\n * All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js\r\n * Common names include:\r\n * sendDataToCloud;\r\n * (2D) zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d;\r\n * (Cartesian) hoverClosestCartesian, hoverCompareCartesian;\r\n * (3D) zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d;\r\n * (Geo) zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo;\r\n * hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews.\r\n */\n modeBarButtonsToRemove: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Add mode bar button using config objects\r\n */\n modeBarButtonsToAdd: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n\n /**\r\n * Fully custom mode bar buttons as nested array,\r\n * where the outer arrays represents button groups, and\r\n * the inner arrays have buttons config objects or names of default buttons\r\n */\n modeBarButtons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,\n\n /**\r\n * Modifications to how the toImage modebar button works\r\n */\n toImageButtonOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.exact({\n /**\r\n * The file format to create\r\n */\n format: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['jpeg', 'png', 'webp', 'svg']),\n\n /**\r\n * The name given to the downloaded file\r\n */\n filename: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Width of the downloaded file, in px\r\n */\n width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Height of the downloaded file, in px\r\n */\n height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * Extra resolution to give the file after\r\n * rendering it with the given width and height\r\n */\n scale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n }),\n\n /**\r\n * Add the plotly logo on the end of the mode bar\r\n */\n displaylogo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Add the plotly logo even with no modebar\r\n */\n watermark: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Increase the pixel ratio for Gl plot images\r\n */\n plotGlPixelRatio: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n /**\r\n * URL to topojson files used in geo charts\r\n */\n topojsonURL: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Mapbox access token (required to plot mapbox trace types)\r\n * If using an Mapbox Atlas server, set this option to '',\r\n * so that plotly.js won't attempt to authenticate to the public Mapbox server.\r\n */\n mapboxAccessToken: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.any,\n\n /**\r\n * The locale to use. Locales may be provided with the plot\r\n * (`locales` below) or by loading them on the page, see:\r\n * https://github.com/plotly/plotly.js/blob/master/dist/README.md#to-include-localization\r\n */\n locale: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Localization definitions, if you choose to provide them with the\r\n * plot rather than registering them globally.\r\n */\n locales: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n }),\n\n /**\r\n * Function that updates the state tree.\r\n */\n setProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n\n /**\r\n * Object that holds the loading state object coming from dash-renderer\r\n */\n loading_state: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n /**\r\n * Determines if the component is loading or not\r\n */\n is_loading: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n /**\r\n * Holds which property is loading\r\n */\n prop_name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n\n /**\r\n * Holds the name of the component that is loading\r\n */\n component_name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n })\n};\nvar graphDefaultProps = {\n clickData: null,\n clickAnnotationData: null,\n hoverData: null,\n selectedData: null,\n relayoutData: null,\n extendData: null,\n restyleData: null,\n figure: {\n data: [],\n layout: {},\n frames: []\n },\n animate: false,\n animation_options: {\n frame: {\n redraw: false\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out'\n }\n },\n clear_on_unhover: false,\n config: {}\n};\nExtendableGraph.propTypes = graphPropTypes;\nExtendableGraph.defaultProps = graphDefaultProps;\n/* harmony default export */ __webpack_exports__[\"default\"] = (ExtendableGraph);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2V4dGVuZGFibGVfZ3JhcGgvLi9zcmMvbGliL2NvbXBvbmVudHMvRXh0ZW5kYWJsZUdyYXBoLnJlYWN0LmpzP2RiNTYiXSwibmFtZXMiOlsiZmlsdGVyRXZlbnREYXRhIiwiZ2QiLCJldmVudERhdGEiLCJldmVudCIsImZpbHRlcmVkRXZlbnREYXRhIiwiY29udGFpbnMiLCJwb2ludHMiLCJpc05pbCIsImRhdGEiLCJpIiwibGVuZ3RoIiwiZnVsbFBvaW50IiwicG9pbnREYXRhIiwiZmlsdGVyIiwibyIsInR5cGUiLCJoYXMiLCJjdXJ2ZU51bWJlciIsImN1c3RvbWRhdGEiLCJwb2ludE51bWJlciIsInBvaW50TnVtYmVycyIsInJhbmdlIiwibGFzc29Qb2ludHMiLCJFeHRlbmRhYmxlR3JhcGgiLCJwcm9wcyIsIlJlYWN0IiwiY3JlYXRlUmVmIiwiYmluZEV2ZW50cyIsImJpbmQiLCJfaGFzUGxvdHRlZCIsIl9wcmV2R2QiLCJncmFwaFJlc2l6ZSIsImZpZ3VyZSIsImFuaW1hdGUiLCJhbmltYXRpb25fb3B0aW9ucyIsImNvbmZpZyIsImN1cnJlbnQiLCJQbG90bHkiLCJyZWFjdCIsImxheW91dCIsImNsb25lIiwiZnJhbWVzIiwidGhlbiIsInJlbW92ZUFsbExpc3RlbmVycyIsInB1cmdlIiwiUGxvdHMiLCJyZXNpemUiLCJleHRlbmREYXRhIiwidXBkYXRlRGF0YSIsInRyYWNlSW5kaWNlcyIsIm1heFBvaW50cyIsImNyZWF0ZURhdGFPYmplY3QiLCJkYXRhcHJvcHMiLCJPYmplY3QiLCJrZXlzIiwicmV0IiwicGxvdCIsIkFycmF5IiwiaXNBcnJheSIsImZyb20iLCJlbnRyaWVzIiwidmFsdWUiLCJ1cGRhdGVPYmplY3QiLCJleHRlbmRUcmFjZXMiLCJhZGRUcmFjZXMiLCJzZXRQcm9wcyIsImNsZWFyX29uX3VuaG92ZXIiLCJyZWxheW91dERhdGEiLCJyZXN0eWxlRGF0YSIsImhvdmVyRGF0YSIsInNlbGVjdGVkRGF0YSIsIm9uIiwiY2xpY2tEYXRhIiwiY2xpY2tBbm5vdGF0aW9uRGF0YSIsIm9taXQiLCJob3ZlciIsImVxdWFscyIsInNlbGVjdGVkIiwicmVsYXlvdXQiLCJyZXN0eWxlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJuZXh0UHJvcHMiLCJpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdHlsZSIsImlkQ2hhbmdlZCIsImZpZ3VyZUNoYW5nZWQiLCJleHRlbmREYXRhQ2hhbmdlZCIsImV4dGVuZCIsInByZXZQcm9wcyIsImNsYXNzTmFtZSIsImxvYWRpbmdfc3RhdGUiLCJpc19sb2FkaW5nIiwidW5kZWZpbmVkIiwiQ29tcG9uZW50IiwiZ3JhcGhQcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvYmplY3QiLCJib29sIiwib25lT2ZUeXBlIiwiYXJyYXkiLCJleGFjdCIsImFycmF5T2YiLCJzdGF0aWNQbG90IiwicGxvdGx5U2VydmVyVVJMIiwiZWRpdGFibGUiLCJlZGl0cyIsImFubm90YXRpb25Qb3NpdGlvbiIsImFubm90YXRpb25UYWlsIiwiYW5ub3RhdGlvblRleHQiLCJheGlzVGl0bGVUZXh0IiwiY29sb3JiYXJQb3NpdGlvbiIsImNvbG9yYmFyVGl0bGVUZXh0IiwibGVnZW5kUG9zaXRpb24iLCJsZWdlbmRUZXh0Iiwic2hhcGVQb3NpdGlvbiIsInRpdGxlVGV4dCIsImF1dG9zaXphYmxlIiwicmVzcG9uc2l2ZSIsInF1ZXVlTGVuZ3RoIiwibnVtYmVyIiwiZmlsbEZyYW1lIiwiZnJhbWVNYXJnaW5zIiwic2Nyb2xsWm9vbSIsImRvdWJsZUNsaWNrIiwib25lT2YiLCJzaG93VGlwcyIsInNob3dBeGlzRHJhZ0hhbmRsZXMiLCJzaG93QXhpc1JhbmdlRW50cnlCb3hlcyIsInNob3dMaW5rIiwic2VuZERhdGEiLCJsaW5rVGV4dCIsImRpc3BsYXlNb2RlQmFyIiwic2hvd1NlbmRUb0Nsb3VkIiwibW9kZUJhckJ1dHRvbnNUb1JlbW92ZSIsIm1vZGVCYXJCdXR0b25zVG9BZGQiLCJtb2RlQmFyQnV0dG9ucyIsImFueSIsInRvSW1hZ2VCdXR0b25PcHRpb25zIiwiZm9ybWF0IiwiZmlsZW5hbWUiLCJ3aWR0aCIsImhlaWdodCIsInNjYWxlIiwiZGlzcGxheWxvZ28iLCJ3YXRlcm1hcmsiLCJwbG90R2xQaXhlbFJhdGlvIiwidG9wb2pzb25VUkwiLCJtYXBib3hBY2Nlc3NUb2tlbiIsImxvY2FsZSIsImxvY2FsZXMiLCJmdW5jIiwic2hhcGUiLCJwcm9wX25hbWUiLCJjb21wb25lbnRfbmFtZSIsImdyYXBoRGVmYXVsdFByb3BzIiwiZnJhbWUiLCJyZWRyYXciLCJ0cmFuc2l0aW9uIiwiZHVyYXRpb24iLCJlYXNlIiwicHJvcFR5cGVzIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQU1BLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQ0MsRUFBRCxFQUFLQyxTQUFMLEVBQWdCQyxLQUFoQixFQUEwQjtBQUM5QyxNQUFJQyxpQkFBSjs7QUFDQSxNQUFJQyxzREFBUSxDQUFDRixLQUFELEVBQVEsQ0FBQyxPQUFELEVBQVUsT0FBVixFQUFtQixVQUFuQixDQUFSLENBQVosRUFBcUQ7QUFDakQsUUFBTUcsTUFBTSxHQUFHLEVBQWY7O0FBRUEsUUFBSUMsbURBQUssQ0FBQ0wsU0FBRCxDQUFULEVBQXNCO0FBQ2xCLGFBQU8sSUFBUDtBQUNIO0FBRUQ7Ozs7Ozs7Ozs7QUFRQSxRQUFNTSxJQUFJLEdBQUdQLEVBQUUsQ0FBQ08sSUFBaEI7O0FBRUEsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHUCxTQUFTLENBQUNJLE1BQVYsQ0FBaUJJLE1BQXJDLEVBQTZDRCxDQUFDLEVBQTlDLEVBQWtEO0FBQzlDLFVBQU1FLFNBQVMsR0FBR1QsU0FBUyxDQUFDSSxNQUFWLENBQWlCRyxDQUFqQixDQUFsQjtBQUNBLFVBQU1H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QkosV0FBUyxFQUFFLElBSFc7QUFJdEJDLGNBQVksRUFBRSxJQUpRO0FBS3RCSCxjQUFZLEVBQUUsSUFMUTtBQU10QnBCLFlBQVUsRUFBRSxJQU5VO0FBT3RCcUIsYUFBVyxFQUFFLElBUFM7QUFRdEJwQyxRQUFNLEVBQUU7QUFBQ3hCLFFBQUksRUFBRSxFQUFQO0FBQVcrQixVQUFNLEVBQUUsRUFBbkI7QUFBdUJFLFVBQU0sRUFBRTtBQUEvQixHQVJjO0FBU3RCUixTQUFPLEVBQUUsS0FUYTtBQVV0QkMsbUJBQWlCLEVBQUU7QUFDZjhILFNBQUssRUFBRTtBQUNIQyxZQUFNLEVBQUU7QUFETCxLQURRO0FBSWZDLGNBQVUsRUFBRTtBQUNSQyxjQUFRLEVBQUUsR0FERjtBQUVSQyxVQUFJLEVBQUU7QUFGRTtBQUpHLEdBVkc7QUFtQnRCbEcsa0JBQWdCLEVBQUUsS0FuQkk7QUFvQnRCL0IsUUFBTSxFQUFFO0FBcEJjLENBQTFCO0FBdUJBWixlQUFlLENBQUM4SSxTQUFoQixHQUE0Qm5FLGNBQTVCO0FBQ0EzRSxlQUFlLENBQUMrSSxZQUFoQixHQUErQlAsaUJBQS9CO0FBRWV4SSw4RUFBZiIsImZpbGUiOiIuL3NyYy9saWIvY29tcG9uZW50cy9FeHRlbmRhYmxlR3JhcGgucmVhY3QuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcclxuaW1wb3J0IHtjb250YWlucywgZmlsdGVyLCBjbG9uZSwgaGFzLCBpc05pbCwgdHlwZSwgb21pdCwgZXF1YWxzfSBmcm9tICdyYW1kYSc7XHJcbi8qIGdsb2JhbCBQbG90bHk6dHJ1ZSAqL1xyXG5cclxuY29uc3QgZmlsdGVyRXZlbnREYXRhID0gKGdkLCBldmVudERhdGEsIGV2ZW50KSA9PiB7XHJcbiAgICBsZXQgZmlsdGVyZWRFdmVudERhdGE7XHJcbiAgICBpZiAoY29udGFpbnMoZXZlbnQsIFsnY2xpY2snLCAnaG92ZXInLCAnc2VsZWN0ZWQnXSkpIHtcclxuICAgICAgICBjb25zdCBwb2ludHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmlsKGV2ZW50RGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIHJlbW92ZSBgZGF0YWAsIGBsYXlvdXRgLCBgeGF4aXNgLCBldGNcclxuICAgICAgICAgKiBvYmplY3RzIGZyb20gdGhlIGV2ZW50IGRhdGEgc2luY2UgdGhleSdyZSBzbyBiaWdcclxuICAgICAgICAgKiBhbmQgY2F1c2UgSlNPTiBzdHJpbmdpZnkgY2lyaWN1bGFyIHN0cnVjdHVyZSBlcnJvcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBhbHNvLCBwdWxsIGRvd24gdGhlIGBjdXN0b21kYXRhYCBwb2ludCBmcm9tIHRoZSBkYXRhIGFycmF5XHJcbiAgICAgICAgICogaW50byB0aGUgZXZlbnQgb2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGdkLmRhdGE7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnREYXRhLnBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUG9pbnQgPSBldmVudERhdGEucG9pbnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludERhdGEgPSBmaWx0ZXIoZnVuY3Rpb24obykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWlucyh0eXBlKG8pLCBbJ09iamVjdCcsICdBcnJheSddKTtcclxuICAgICAgICAgICAgfSwgZnVsbFBvaW50KTtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgaGFzKCdjdXJ2ZU51bWJlcicsIGZ1bGxQb2ludCkgJiZcclxuICAgICAgICAgICAgICAgIGhhcygncG9pbnROdW1iZXInLCBmdWxsUG9pbnQpICYmXHJcbiAgICAgICAgICAgICAgICBoYXMoJ2N1c3RvbWRhdGEnLCBkYXRhW3BvaW50RGF0YS5jdXJ2ZU51bWJlcl0pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcG9pbnREYXRhLmN1c3RvbWRhdGEgPVxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFbcG9pbnREYXRhLmN1cnZlTnVtYmVyXS5jdXN0b21kYXRhW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsUG9pbnQucG9pbnROdW1iZXJcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzcGVjaWZpYyB0byBoaXN0b2dyYW0uIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9wdWxsLzIxMTMvXHJcbiAgICAgICAgICAgIGlmIChoYXMoJ3BvaW50TnVtYmVycycsIGZ1bGxQb2ludCkpIHtcclxuICAgICAgICAgICAgICAgIHBvaW50RGF0YS5wb2ludE51bWJlcnMgPSBmdWxsUG9pbnQucG9pbnROdW1iZXJzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludERhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbHRlcmVkRXZlbnREYXRhID0ge3BvaW50c307XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAncmVsYXlvdXQnIHx8IGV2ZW50ID09PSAncmVzdHlsZScpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIHJlbGF5b3V0IHNob3VsZG4ndCBpbmNsdWRlIGFueSBiaWcgb2JqZWN0c1xyXG4gICAgICAgICAqIGl0IHdpbGwgdXN1YWxseSBqdXN0IGNvbnRhaW4gdGhlIHJhbmdlcyBvZiB0aGUgYXhlcyBsaWtlXHJcbiAgICAgICAgICogXCJ4YXhpcy5yYW5nZVswXVwiOiAwLjc3MTU4MjIyNDczODE4MjgsXHJcbiAgICAgICAgICogXCJ4YXhpcy5yYW5nZVsxXVwiOiAzLjAwOTUyOTIwMDg2ODAwNjNgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZmlsdGVyZWRFdmVudERhdGEgPSBldmVudERhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzKCdyYW5nZScsIGV2ZW50RGF0YSkpIHtcclxuICAgICAgICBmaWx0ZXJlZEV2ZW50RGF0YS5yYW5nZSA9IGV2ZW50RGF0YS5yYW5nZTtcclxuICAgIH1cclxuICAgIGlmIChoYXMoJ2xhc3NvUG9pbnRzJywgZXZlbnREYXRhKSkge1xyXG4gICAgICAgIGZpbHRlcmVkRXZlbnREYXRhLmxhc3NvUG9pbnRzID0gZXZlbnREYXRhLmxhc3NvUG9pbnRzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbHRlcmVkRXZlbnREYXRhO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEV4dGVuZGFibGVHcmFwaCBjYW4gYmUgdXNlZCB0byByZW5kZXIgYW55IHBsb3RseS5qcy1wb3dlcmVkIGRhdGEgdmlzLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGRlZmluZSBjYWxsYmFja3MgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbiB3aXRoIEV4dGVuZGFibGVHcmFwaHMgc3VjaFxyXG4gKiBhcyBob3ZlcmluZywgY2xpY2tpbmcgb3Igc2VsZWN0aW5nXHJcbiAqL1xyXG5jbGFzcyBFeHRlbmRhYmxlR3JhcGggZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5nZCA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyA9IHRoaXMuYmluZEV2ZW50cy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhc1Bsb3R0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wcmV2R2QgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZ3JhcGhSZXNpemUgPSB0aGlzLmdyYXBoUmVzaXplLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcGxvdChwcm9wcykge1xyXG4gICAgICAgIGNvbnN0IHtmaWd1cmUsIGFuaW1hdGUsIGFuaW1hdGlvbl9vcHRpb25zLCBjb25maWd9ID0gcHJvcHM7XHJcbiAgICAgICAgY29uc3QgZ2QgPSB0aGlzLmdkLmN1cnJlbnQ7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgYW5pbWF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLl9oYXNQbG90dGVkICYmXHJcbiAgICAgICAgICAgIGZpZ3VyZS5kYXRhLmxlbmd0aCA9PT0gZ2QuZGF0YS5sZW5ndGhcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFBsb3RseS5hbmltYXRlKGdkLCBmaWd1cmUsIGFuaW1hdGlvbl9vcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFBsb3RseS5yZWFjdChnZCwge1xyXG4gICAgICAgICAgICBkYXRhOiBmaWd1cmUuZGF0YSxcclxuICAgICAgICAgICAgbGF5b3V0OiBjbG9uZShmaWd1cmUubGF5b3V0KSxcclxuICAgICAgICAgICAgZnJhbWVzOiBmaWd1cmUuZnJhbWVzLFxyXG4gICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcclxuICAgICAgICB9KS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ2QgPSB0aGlzLmdkLmN1cnJlbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyBkb3VibGUtY2hlY2sgZ2QgaGFzbid0IGJlZW4gdW5tb3VudGVkXHJcbiAgICAgICAgICAgIGlmICghZ2QpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaW4gY2FzZSB3ZSd2ZSBtYWRlIGEgbmV3IERPTSBlbGVtZW50LCB0cmFuc2ZlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1Bsb3R0ZWQgJiYgZ2QgIT09IHRoaXMuX3ByZXZHZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZHZCAmJiB0aGlzLl9wcmV2R2QucmVtb3ZlQWxsTGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldkdkLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gICAgICAgICAgICAgICAgICAgIFBsb3RseS5wdXJnZSh0aGlzLl9wcmV2R2QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUGxvdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2hhc1Bsb3R0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgUGxvdGx5LlBsb3RzLnJlc2l6ZShnZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNQbG90dGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZHZCA9IGdkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXh0ZW5kKHByb3BzKSB7XHJcbiAgICAgICAgY29uc3Qge2V4dGVuZERhdGF9ID0gcHJvcHM7XHJcbiAgICAgICAgY29uc3QgZ2QgPSB0aGlzLmdkLmN1cnJlbnQ7XHJcbiAgICAgICAgbGV0IHVwZGF0ZURhdGEsIHRyYWNlSW5kaWNlcywgbWF4UG9pbnRzO1xyXG5cclxuICAgICAgICBpZiAoZXh0ZW5kRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZ2QuZGF0YS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaWd1cmUgaGFzIG5vIHByZS1leGlzdGluZyBkYXRhLiByZWRpcmVjdCB0byBwbG90KClcclxuICAgICAgICAgICAgICAgIHByb3BzLmZpZ3VyZS5kYXRhID0gZXh0ZW5kRGF0YTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3QocHJvcHMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHRlbmREYXRhKSAmJiBBcnJheS5pc0FycmF5KGV4dGVuZERhdGFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlRGF0YSwgdHJhY2VJbmRpY2VzLCBtYXhQb2ludHNdID0gZXh0ZW5kRGF0YTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZURhdGEgPSBleHRlbmREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRyYWNlSW5kaWNlcykge1xyXG4gICAgICAgICAgICAgICAgdHJhY2VJbmRpY2VzID0gQXJyYXkuZnJvbShBcnJheSh1cGRhdGVEYXRhLmxlbmd0aCkua2V5cygpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlRGF0YU9iamVjdChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhcHJvcHMgPSBPYmplY3Qua2V5cyhkYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhcHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByZXRbZGF0YXByb3BzW2ldXSA9IFtkYXRhW2RhdGFwcm9wc1tpXV1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgdmFsdWVdIG9mIHVwZGF0ZURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVPYmplY3QgPSBjcmVhdGVEYXRhT2JqZWN0KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpIDwgdXBkYXRlRGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlSW5kaWNlc1tpXSA8IGdkLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsb3RseS5leHRlbmRUcmFjZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9iamVjdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFjZUluZGljZXNbaV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxvdGx5LmFkZFRyYWNlcyhnZCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlSW5kaWNlc1tpXSA8IGdkLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbG90bHkuZXh0ZW5kVHJhY2VzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhY2VJbmRpY2VzW2ldXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvaW50c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGxvdGx5LmFkZFRyYWNlcyhnZCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wbG90KHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBncmFwaFJlc2l6ZSgpIHtcclxuICAgICAgICBjb25zdCBnZCA9IHRoaXMuZ2QuY3VycmVudDtcclxuICAgICAgICBpZiAoZ2QpIHtcclxuICAgICAgICAgICAgUGxvdGx5LlBsb3RzLnJlc2l6ZShnZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICBzZXRQcm9wcyxcclxuICAgICAgICAgICAgY2xlYXJfb25fdW5ob3ZlcixcclxuICAgICAgICAgICAgcmVsYXlvdXREYXRhLFxyXG4gICAgICAgICAgICByZXN0eWxlRGF0YSxcclxuICAgICAgICAgICAgaG92ZXJEYXRhLFxyXG4gICAgICAgICAgICBzZWxlY3RlZERhdGEsXHJcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgIGNvbnN0IGdkID0gdGhpcy5nZC5jdXJyZW50O1xyXG5cclxuICAgICAgICBnZC5vbigncGxvdGx5X2NsaWNrJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2tEYXRhID0gZmlsdGVyRXZlbnREYXRhKGdkLCBldmVudERhdGEsICdjbGljaycpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKGNsaWNrRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtjbGlja0RhdGF9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdkLm9uKCdwbG90bHlfY2xpY2thbm5vdGF0aW9uJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2tBbm5vdGF0aW9uRGF0YSA9IG9taXQoXHJcbiAgICAgICAgICAgICAgICBbJ2V2ZW50JywgJ2Z1bGxBbm5vdGF0aW9uJ10sXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGFcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgc2V0UHJvcHMoe2NsaWNrQW5ub3RhdGlvbkRhdGF9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBnZC5vbigncGxvdGx5X2hvdmVyJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaG92ZXIgPSBmaWx0ZXJFdmVudERhdGEoZ2QsIGV2ZW50RGF0YSwgJ2hvdmVyJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNOaWwoaG92ZXIpICYmICFlcXVhbHMoaG92ZXIsIGhvdmVyRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtob3ZlckRhdGE6IGhvdmVyfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBnZC5vbigncGxvdGx5X3NlbGVjdGVkJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBmaWx0ZXJFdmVudERhdGEoZ2QsIGV2ZW50RGF0YSwgJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNOaWwoc2VsZWN0ZWQpICYmICFlcXVhbHMoc2VsZWN0ZWQsIHNlbGVjdGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtzZWxlY3RlZERhdGE6IHNlbGVjdGVkfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBnZC5vbigncGxvdGx5X2Rlc2VsZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRQcm9wcyh7c2VsZWN0ZWREYXRhOiBudWxsfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ2Qub24oJ3Bsb3RseV9yZWxheW91dCcsIGV2ZW50RGF0YSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGF5b3V0ID0gZmlsdGVyRXZlbnREYXRhKGdkLCBldmVudERhdGEsICdyZWxheW91dCcpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKHJlbGF5b3V0KSAmJiAhZXF1YWxzKHJlbGF5b3V0LCByZWxheW91dERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRQcm9wcyh7cmVsYXlvdXREYXRhOiByZWxheW91dH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ2Qub24oJ3Bsb3RseV9yZXN0eWxlJywgZXZlbnREYXRhID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdHlsZSA9IGZpbHRlckV2ZW50RGF0YShnZCwgZXZlbnREYXRhLCAncmVzdHlsZScpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKHJlc3R5bGUpICYmICFlcXVhbHMocmVzdHlsZSwgcmVzdHlsZURhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRQcm9wcyh7cmVzdHlsZURhdGE6IHJlc3R5bGV9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdkLm9uKCdwbG90bHlfdW5ob3ZlcicsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNsZWFyX29uX3VuaG92ZXIpIHtcclxuICAgICAgICAgICAgICAgIHNldFByb3BzKHtob3ZlckRhdGE6IG51bGx9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMucGxvdCh0aGlzLnByb3BzKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZ3JhcGhSZXNpemUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGdkID0gdGhpcy5nZC5jdXJyZW50O1xyXG4gICAgICAgIGlmIChnZCAmJiBnZC5yZW1vdmVBbGxMaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgZ2QucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIFBsb3RseS5wdXJnZShnZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmdyYXBoUmVzaXplKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5pZCAhPT0gbmV4dFByb3BzLmlkIHx8XHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuc3R5bGUpICE9PSBKU09OLnN0cmluZ2lmeShuZXh0UHJvcHMuc3R5bGUpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xyXG4gICAgICAgIGNvbnN0IGlkQ2hhbmdlZCA9IHRoaXMucHJvcHMuaWQgIT09IG5leHRQcm9wcy5pZDtcclxuICAgICAgICBpZiAoaWRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIHRoZW4gdGhlIGRvbSBuZWVkcyB0byBnZXQgcmUtcmVuZGVyZWQgd2l0aCBhIG5ldyBJRC5cclxuICAgICAgICAgICAgICogdGhlIGdyYXBoIHdpbGwgZ2V0IHVwZGF0ZWQgaW4gY29tcG9uZW50RGlkVXBkYXRlXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWd1cmVDaGFuZ2VkID0gdGhpcy5wcm9wcy5maWd1cmUgIT09IG5leHRQcm9wcy5maWd1cmU7XHJcbiAgICAgICAgaWYgKGZpZ3VyZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wbG90KG5leHRQcm9wcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleHRlbmREYXRhQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuZXh0ZW5kRGF0YSAhPT0gbmV4dFByb3BzLmV4dGVuZERhdGE7XHJcbiAgICAgICAgaWYgKGV4dGVuZERhdGFDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kKG5leHRQcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcclxuICAgICAgICBpZiAocHJldlByb3BzLmlkICE9PSB0aGlzLnByb3BzLmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGxvdCh0aGlzLnByb3BzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtjbGFzc05hbWUsIGlkLCBzdHlsZSwgbG9hZGluZ19zdGF0ZX0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBrZXk9e2lkfVxyXG4gICAgICAgICAgICAgICAgaWQ9e2lkfVxyXG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLmdkfVxyXG4gICAgICAgICAgICAgICAgZGF0YS1kYXNoLWlzLWxvYWRpbmc9e1xyXG4gICAgICAgICAgICAgICAgICAgIChsb2FkaW5nX3N0YXRlICYmIGxvYWRpbmdfc3RhdGUuaXNfbG9hZGluZykgfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBncmFwaFByb3BUeXBlcyA9IHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIElEIG9mIHRoaXMgY29tcG9uZW50LCB1c2VkIHRvIGlkZW50aWZ5IGRhc2ggY29tcG9uZW50c1xyXG4gICAgICogaW4gY2FsbGJhY2tzLiBUaGUgSUQgbmVlZHMgdG8gYmUgdW5pcXVlIGFjcm9zcyBhbGwgb2YgdGhlXHJcbiAgICAgKiBjb21wb25lbnRzIGluIGFuIGFwcC5cclxuICAgICAqL1xyXG4gICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgZnJvbSBsYXRlc3QgY2xpY2sgZXZlbnQuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgY2xpY2tEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBmcm9tIGxhdGVzdCBjbGljayBhbm5vdGF0aW9uIGV2ZW50LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIGNsaWNrQW5ub3RhdGlvbkRhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGZyb20gbGF0ZXN0IGhvdmVyIGV2ZW50LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIGhvdmVyRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIFRydWUsIGBjbGVhcl9vbl91bmhvdmVyYCB3aWxsIGNsZWFyIHRoZSBgaG92ZXJEYXRhYCBwcm9wZXJ0eVxyXG4gICAgICogd2hlbiB0aGUgdXNlciBcInVuaG92ZXJzXCIgZnJvbSBhIHBvaW50LlxyXG4gICAgICogSWYgRmFsc2UsIHRoZW4gdGhlIGBob3ZlckRhdGFgIHByb3BlcnR5IHdpbGwgYmUgZXF1YWwgdG8gdGhlXHJcbiAgICAgKiBkYXRhIGZyb20gdGhlIGxhc3QgcG9pbnQgdGhhdCB3YXMgaG92ZXJlZCBvdmVyLlxyXG4gICAgICovXHJcbiAgICBjbGVhcl9vbl91bmhvdmVyOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgZnJvbSBsYXRlc3Qgc2VsZWN0IGV2ZW50LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGVkRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgZnJvbSBsYXRlc3QgcmVsYXlvdXQgZXZlbnQgd2hpY2ggb2NjdXJzXHJcbiAgICAgKiB3aGVuIHRoZSB1c2VyIHpvb21zIG9yIHBhbnMgb24gdGhlIHBsb3Qgb3Igb3RoZXJcclxuICAgICAqIGxheW91dC1sZXZlbCBlZGl0cy4gSGFzIHRoZSBmb3JtIGB7PGF0dHIgc3RyaW5nPjogPHZhbHVlPn1gXHJcbiAgICAgKiBkZXNjcmliaW5nIHRoZSBjaGFuZ2VzIG1hZGUuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgcmVsYXlvdXREYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSB0aGF0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBleGlzdGluZyB0cmFjZXMuIEhhcyB0aGUgZm9ybVxyXG4gICAgICogYFt1cGRhdGVEYXRhLCB0cmFjZUluZGljZXMsIG1heFBvaW50c11gLCB3aGVyZSBgdXBkYXRlRGF0YWAgaXMgYW4gYXJyYXlcclxuICAgICAqIGNvbnRhaW5pbmcgZGF0YSBvYmplY3RzIHRvIGV4dGVuZCwgYHRyYWNlSW5kaWNlc2AgKG9wdGlvbmFsKSBpcyBhbiBhcnJheVxyXG4gICAgICogb2YgdHJhY2UgaW5kaWNlcyB0aGF0IHNob3VsZCBiZSBleHRlbmRlZCwgYW5kIGBtYXhQb2ludHNgIChvcHRpb25hbCkgaXNcclxuICAgICAqIGVpdGhlciBhbiBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgYWxsb3dlZCBvciBhblxyXG4gICAgICogb2JqZWN0IHdpdGgga2V5OnZhbHVlIHBhaXJzIG1hdGNoaW5nIGB1cGRhdGVEYXRhYFxyXG4gICAgICogUmVmZXJlbmNlIHRoZSBQbG90bHkuZXh0ZW5kVHJhY2VzIEFQSSBmb3IgZnVsbCB1c2FnZTpcclxuICAgICAqIGh0dHBzOi8vcGxvdC5seS9qYXZhc2NyaXB0L3Bsb3RseWpzLWZ1bmN0aW9uLXJlZmVyZW5jZS8jcGxvdGx5ZXh0ZW5kdHJhY2VzXHJcbiAgICAgKi9cclxuICAgIGV4dGVuZERhdGE6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgUHJvcFR5cGVzLm9iamVjdF0pLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBmcm9tIGxhdGVzdCByZXN0eWxlIGV2ZW50IHdoaWNoIG9jY3Vyc1xyXG4gICAgICogd2hlbiB0aGUgdXNlciB0b2dnbGVzIGEgbGVnZW5kIGl0ZW0sIGNoYW5nZXNcclxuICAgICAqIHBhcmNvb3JkcyBzZWxlY3Rpb25zLCBvciBvdGhlciB0cmFjZS1sZXZlbCBlZGl0cy5cclxuICAgICAqIEhhcyB0aGUgZm9ybSBgW2VkaXRzLCBpbmRpY2VzXWAsIHdoZXJlIGBlZGl0c2AgaXMgYW4gb2JqZWN0XHJcbiAgICAgKiBgezxhdHRyIHN0cmluZz46IDx2YWx1ZT59YCBkZXNjcmliaW5nIHRoZSBjaGFuZ2VzIG1hZGUsXHJcbiAgICAgKiBhbmQgYGluZGljZXNgIGlzIGFuIGFycmF5IG9mIHRyYWNlIGluZGljZXMgdGhhdCB3ZXJlIGVkaXRlZC5cclxuICAgICAqIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgcmVzdHlsZURhdGE6IFByb3BUeXBlcy5hcnJheSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBsb3RseSBgZmlndXJlYCBvYmplY3QuIFNlZSBzY2hlbWE6XHJcbiAgICAgKiBodHRwczovL3Bsb3QubHkvamF2YXNjcmlwdC9yZWZlcmVuY2VcclxuICAgICAqXHJcbiAgICAgKiBgY29uZmlnYCBpcyBzZXQgc2VwYXJhdGVseSBieSB0aGUgYGNvbmZpZ2AgcHJvcGVydHlcclxuICAgICAqL1xyXG4gICAgZmlndXJlOiBQcm9wVHlwZXMuZXhhY3Qoe1xyXG4gICAgICAgIGRhdGE6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG4gICAgICAgIGxheW91dDogUHJvcFR5cGVzLm9iamVjdCxcclxuICAgICAgICBmcmFtZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG4gICAgfSksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmljIHN0eWxlIG92ZXJyaWRlcyBvbiB0aGUgcGxvdCBkaXZcclxuICAgICAqL1xyXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjbGFzc05hbWUgb2YgdGhlIHBhcmVudCBkaXZcclxuICAgICAqL1xyXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmV0YTogSWYgdHJ1ZSwgYW5pbWF0ZSBiZXR3ZWVuIHVwZGF0ZXMgdXNpbmdcclxuICAgICAqIHBsb3RseS5qcydzIGBhbmltYXRlYCBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBhbmltYXRlOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJldGE6IE9iamVjdCBjb250YWluaW5nIGFuaW1hdGlvbiBzZXR0aW5ncy5cclxuICAgICAqIE9ubHkgYXBwbGllcyBpZiBgYW5pbWF0ZWAgaXMgYHRydWVgXHJcbiAgICAgKi9cclxuICAgIGFuaW1hdGlvbl9vcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGxvdGx5LmpzIGNvbmZpZyBvcHRpb25zLlxyXG4gICAgICogU2VlIGh0dHBzOi8vcGxvdC5seS9qYXZhc2NyaXB0L2NvbmZpZ3VyYXRpb24tb3B0aW9ucy9cclxuICAgICAqIGZvciBtb3JlIGluZm8uXHJcbiAgICAgKi9cclxuICAgIGNvbmZpZzogUHJvcFR5cGVzLmV4YWN0KHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBObyBpbnRlcmFjdGl2aXR5LCBmb3IgZXhwb3J0IG9yIGltYWdlIGdlbmVyYXRpb25cclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWNQbG90OiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQmFzZSBVUkwgZm9yIGEgUGxvdGx5IGNsb3VkIGluc3RhbmNlLCBpZiBgc2hvd1NlbmRUb0Nsb3VkYCBpcyBlbmFibGVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGxvdGx5U2VydmVyVVJMOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXZSBjYW4gZWRpdCB0aXRsZXMsIG1vdmUgYW5ub3RhdGlvbnMsIGV0YyAtIHNldHMgYWxsIHBpZWNlcyBvZiBgZWRpdHNgXHJcbiAgICAgICAgICogdW5sZXNzIGEgc2VwYXJhdGUgYGVkaXRzYCBjb25maWcgaXRlbSBvdmVycmlkZXMgaW5kaXZpZHVhbCBwYXJ0c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVkaXRhYmxlOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzZXQgb2YgZWRpdGFibGUgcHJvcGVydGllc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVkaXRzOiBQcm9wVHlwZXMuZXhhY3Qoe1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIG1haW4gYW5jaG9yIG9mIHRoZSBhbm5vdGF0aW9uLCB3aGljaCBpcyB0aGVcclxuICAgICAgICAgICAgICogdGV4dCAoaWYgbm8gYXJyb3cpIG9yIHRoZSBhcnJvdyAod2hpY2ggZHJhZ3MgdGhlIHdob2xlIHRoaW5nIGxlYXZpbmdcclxuICAgICAgICAgICAgICogdGhlIGFycm93IGxlbmd0aCAmIGRpcmVjdGlvbiB1bmNoYW5nZWQpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBhbm5vdGF0aW9uUG9zaXRpb246IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEp1c3QgZm9yIGFubm90YXRpb25zIHdpdGggYXJyb3dzLCBjaGFuZ2UgdGhlIGxlbmd0aCBhbmQgZGlyZWN0aW9uIG9mIHRoZSBhcnJvd1xyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgYW5ub3RhdGlvblRhaWw6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgYW5ub3RhdGlvblRleHQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgYXhpc1RpdGxlVGV4dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgICAgICBjb2xvcmJhclBvc2l0aW9uOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIGNvbG9yYmFyVGl0bGVUZXh0OiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBFZGl0IHRoZSB0cmFjZSBuYW1lIGZpZWxkcyBmcm9tIHRoZSBsZWdlbmRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxlZ2VuZFRleHQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAgICAgc2hhcGVQb3NpdGlvbjogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIGdsb2JhbCBgbGF5b3V0LnRpdGxlYFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGl0bGVUZXh0OiBQcm9wVHlwZXMuYm9vbCxcclxuICAgICAgICB9KSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRE8gYXV0b3NpemUgb25jZSByZWdhcmRsZXNzIG9mIGxheW91dC5hdXRvc2l6ZVxyXG4gICAgICAgICAqICh1c2UgZGVmYXVsdCB3aWR0aCBvciBoZWlnaHQgdmFsdWVzIG90aGVyd2lzZSlcclxuICAgICAgICAgKi9cclxuICAgICAgICBhdXRvc2l6YWJsZTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdG8gY2hhbmdlIGxheW91dCBzaXplIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXNwb25zaXZlOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IHRoZSBsZW5ndGggb2YgdGhlIHVuZG8vcmVkbyBxdWV1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHF1ZXVlTGVuZ3RoOiBQcm9wVHlwZXMubnVtYmVyLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB3ZSBETyBhdXRvc2l6ZSwgZG8gd2UgZmlsbCB0aGUgY29udGFpbmVyIG9yIHRoZSBzY3JlZW4/XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZmlsbEZyYW1lOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgd2UgRE8gYXV0b3NpemUsIHNldCB0aGUgZnJhbWUgbWFyZ2lucyBpbiBwZXJjZW50cyBvZiBwbG90IHNpemVcclxuICAgICAgICAgKi9cclxuICAgICAgICBmcmFtZU1hcmdpbnM6IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vdXNld2hlZWwgb3IgdHdvLWZpbmdlciBzY3JvbGwgem9vbXMgdGhlIHBsb3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBzY3JvbGxab29tOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG91YmxlIGNsaWNrIGludGVyYWN0aW9uIChmYWxzZSwgJ3Jlc2V0JywgJ2F1dG9zaXplJyBvciAncmVzZXQrYXV0b3NpemUnKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRvdWJsZUNsaWNrOiBQcm9wVHlwZXMub25lT2YoW1xyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgJ3Jlc2V0JyxcclxuICAgICAgICAgICAgJ2F1dG9zaXplJyxcclxuICAgICAgICAgICAgJ3Jlc2V0K2F1dG9zaXplJyxcclxuICAgICAgICBdKSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTmV3IHVzZXJzIHNlZSBzb21lIGhpbnRzIGFib3V0IGludGVyYWN0aXZpdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93VGlwczogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEVuYWJsZSBheGlzIHBhbi96b29tIGRyYWcgaGFuZGxlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dBeGlzRHJhZ0hhbmRsZXM6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFbmFibGUgZGlyZWN0IHJhbmdlIGVudHJ5IGF0IHRoZSBwYW4vem9vbSBkcmFnIHBvaW50c1xyXG4gICAgICAgICAqIChkcmFnIGhhbmRsZXMgbXVzdCBiZSBlbmFibGVkIGFib3ZlKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dBeGlzUmFuZ2VFbnRyeUJveGVzOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTGluayB0byBvcGVuIHRoaXMgcGxvdCBpbiBwbG90bHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93TGluazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHdlIHNob3cgYSBsaW5rLCBkb2VzIGl0IGNvbnRhaW4gZGF0YSBvciBqdXN0IGxpbmsgdG8gYSBwbG90bHkgZmlsZT9cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZW5kRGF0YTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRleHQgYXBwZWFyaW5nIGluIHRoZSBzZW5kRGF0YSBsaW5rXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbGlua1RleHQ6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERpc3BsYXkgdGhlIG1vZGUgYmFyICh0cnVlLCBmYWxzZSwgb3IgJ2hvdmVyJylcclxuICAgICAgICAgKi9cclxuICAgICAgICBkaXNwbGF5TW9kZUJhcjogUHJvcFR5cGVzLm9uZU9mKFt0cnVlLCBmYWxzZSwgJ2hvdmVyJ10pLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTaG91bGQgd2UgaW5jbHVkZSBhIG1vZGViYXIgYnV0dG9uIHRvIHNlbmQgdGhpcyBkYXRhIHRvIGFcclxuICAgICAgICAgKiBQbG90bHkgQ2xvdWQgaW5zdGFuY2UsIGxpbmtlZCBieSBgcGxvdGx5U2VydmVyVVJMYC5cclxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoaXMgaXMgZmFsc2UuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd1NlbmRUb0Nsb3VkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIG1vZGUgYmFyIGJ1dHRvbiBieSBuYW1lLlxyXG4gICAgICAgICAqIEFsbCBtb2RlYmFyIGJ1dHRvbiBuYW1lcyBhdCBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9ibG9iL21hc3Rlci9zcmMvY29tcG9uZW50cy9tb2RlYmFyL2J1dHRvbnMuanNcclxuICAgICAgICAgKiBDb21tb24gbmFtZXMgaW5jbHVkZTpcclxuICAgICAgICAgKiBzZW5kRGF0YVRvQ2xvdWQ7XHJcbiAgICAgICAgICogKDJEKSB6b29tMmQsIHBhbjJkLCBzZWxlY3QyZCwgbGFzc28yZCwgem9vbUluMmQsIHpvb21PdXQyZCwgYXV0b1NjYWxlMmQsIHJlc2V0U2NhbGUyZDtcclxuICAgICAgICAgKiAoQ2FydGVzaWFuKSBob3ZlckNsb3Nlc3RDYXJ0ZXNpYW4sIGhvdmVyQ29tcGFyZUNhcnRlc2lhbjtcclxuICAgICAgICAgKiAoM0QpIHpvb20zZCwgcGFuM2QsIG9yYml0Um90YXRpb24sIHRhYmxlUm90YXRpb24sIGhhbmRsZURyYWczZCwgcmVzZXRDYW1lcmFEZWZhdWx0M2QsIHJlc2V0Q2FtZXJhTGFzdFNhdmUzZCwgaG92ZXJDbG9zZXN0M2Q7XHJcbiAgICAgICAgICogKEdlbykgem9vbUluR2VvLCB6b29tT3V0R2VvLCByZXNldEdlbywgaG92ZXJDbG9zZXN0R2VvO1xyXG4gICAgICAgICAqIGhvdmVyQ2xvc2VzdEdsMmQsIGhvdmVyQ2xvc2VzdFBpZSwgdG9nZ2xlSG92ZXIsIHJlc2V0Vmlld3MuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbW9kZUJhckJ1dHRvbnNUb1JlbW92ZTogUHJvcFR5cGVzLmFycmF5LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBZGQgbW9kZSBiYXIgYnV0dG9uIHVzaW5nIGNvbmZpZyBvYmplY3RzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbW9kZUJhckJ1dHRvbnNUb0FkZDogUHJvcFR5cGVzLmFycmF5LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGdWxseSBjdXN0b20gbW9kZSBiYXIgYnV0dG9ucyBhcyBuZXN0ZWQgYXJyYXksXHJcbiAgICAgICAgICogd2hlcmUgdGhlIG91dGVyIGFycmF5cyByZXByZXNlbnRzIGJ1dHRvbiBncm91cHMsIGFuZFxyXG4gICAgICAgICAqIHRoZSBpbm5lciBhcnJheXMgaGF2ZSBidXR0b25zIGNvbmZpZyBvYmplY3RzIG9yIG5hbWVzIG9mIGRlZmF1bHQgYnV0dG9uc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1vZGVCYXJCdXR0b25zOiBQcm9wVHlwZXMuYW55LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNb2RpZmljYXRpb25zIHRvIGhvdyB0aGUgdG9JbWFnZSBtb2RlYmFyIGJ1dHRvbiB3b3Jrc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvSW1hZ2VCdXR0b25PcHRpb25zOiBQcm9wVHlwZXMuZXhhY3Qoe1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIGZpbGUgZm9ybWF0IHRvIGNyZWF0ZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZm9ybWF0OiBQcm9wVHlwZXMub25lT2YoWydqcGVnJywgJ3BuZycsICd3ZWJwJywgJ3N2ZyddKSxcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFRoZSBuYW1lIGdpdmVuIHRvIHRoZSBkb3dubG9hZGVkIGZpbGVcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogV2lkdGggb2YgdGhlIGRvd25sb2FkZWQgZmlsZSwgaW4gcHhcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSGVpZ2h0IG9mIHRoZSBkb3dubG9hZGVkIGZpbGUsIGluIHB4XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIsXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBFeHRyYSByZXNvbHV0aW9uIHRvIGdpdmUgdGhlIGZpbGUgYWZ0ZXJcclxuICAgICAgICAgICAgICogcmVuZGVyaW5nIGl0IHdpdGggdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHNjYWxlOiBQcm9wVHlwZXMubnVtYmVyLFxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBZGQgdGhlIHBsb3RseSBsb2dvIG9uIHRoZSBlbmQgb2YgdGhlIG1vZGUgYmFyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGlzcGxheWxvZ286IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBZGQgdGhlIHBsb3RseSBsb2dvIGV2ZW4gd2l0aCBubyBtb2RlYmFyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgd2F0ZXJtYXJrOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW5jcmVhc2UgdGhlIHBpeGVsIHJhdGlvIGZvciBHbCBwbG90IGltYWdlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBsb3RHbFBpeGVsUmF0aW86IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVSTCB0byB0b3BvanNvbiBmaWxlcyB1c2VkIGluIGdlbyBjaGFydHNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b3BvanNvblVSTDogUHJvcFR5cGVzLnN0cmluZyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWFwYm94IGFjY2VzcyB0b2tlbiAocmVxdWlyZWQgdG8gcGxvdCBtYXBib3ggdHJhY2UgdHlwZXMpXHJcbiAgICAgICAgICogSWYgdXNpbmcgYW4gTWFwYm94IEF0bGFzIHNlcnZlciwgc2V0IHRoaXMgb3B0aW9uIHRvICcnLFxyXG4gICAgICAgICAqIHNvIHRoYXQgcGxvdGx5LmpzIHdvbid0IGF0dGVtcHQgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBwdWJsaWMgTWFwYm94IHNlcnZlci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBtYXBib3hBY2Nlc3NUb2tlbjogUHJvcFR5cGVzLmFueSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxvY2FsZSB0byB1c2UuIExvY2FsZXMgbWF5IGJlIHByb3ZpZGVkIHdpdGggdGhlIHBsb3RcclxuICAgICAgICAgKiAoYGxvY2FsZXNgIGJlbG93KSBvciBieSBsb2FkaW5nIHRoZW0gb24gdGhlIHBhZ2UsIHNlZTpcclxuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9ibG9iL21hc3Rlci9kaXN0L1JFQURNRS5tZCN0by1pbmNsdWRlLWxvY2FsaXphdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxvY2FsZTogUHJvcFR5cGVzLnN0cmluZyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTG9jYWxpemF0aW9uIGRlZmluaXRpb25zLCBpZiB5b3UgY2hvb3NlIHRvIHByb3ZpZGUgdGhlbSB3aXRoIHRoZVxyXG4gICAgICAgICAqIHBsb3QgcmF0aGVyIHRoYW4gcmVnaXN0ZXJpbmcgdGhlbSBnbG9iYWxseS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBsb2NhbGVzOiBQcm9wVHlwZXMub2JqZWN0LFxyXG4gICAgfSksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIHN0YXRlIHRyZWUuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3BzOiBQcm9wVHlwZXMuZnVuYyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9iamVjdCB0aGF0IGhvbGRzIHRoZSBsb2FkaW5nIHN0YXRlIG9iamVjdCBjb21pbmcgZnJvbSBkYXNoLXJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIGxvYWRpbmdfc3RhdGU6IFByb3BUeXBlcy5zaGFwZSh7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGlzIGxvYWRpbmcgb3Igbm90XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaXNfbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9sZHMgd2hpY2ggcHJvcGVydHkgaXMgbG9hZGluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHByb3BfbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb2xkcyB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgaXMgbG9hZGluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbXBvbmVudF9uYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gICAgfSksXHJcbn07XHJcblxyXG5jb25zdCBncmFwaERlZmF1bHRQcm9wcyA9IHtcclxuICAgIGNsaWNrRGF0YTogbnVsbCxcclxuICAgIGNsaWNrQW5ub3RhdGlvbkRhdGE6IG51bGwsXHJcbiAgICBob3ZlckRhdGE6IG51bGwsXHJcbiAgICBzZWxlY3RlZERhdGE6IG51bGwsXHJcbiAgICByZWxheW91dERhdGE6IG51bGwsXHJcbiAgICBleHRlbmREYXRhOiBudWxsLFxyXG4gICAgcmVzdHlsZURhdGE6IG51bGwsXHJcbiAgICBmaWd1cmU6IHtkYXRhOiBbXSwgbGF5b3V0OiB7fSwgZnJhbWVzOiBbXX0sXHJcbiAgICBhbmltYXRlOiBmYWxzZSxcclxuICAgIGFuaW1hdGlvbl9vcHRpb25zOiB7XHJcbiAgICAgICAgZnJhbWU6IHtcclxuICAgICAgICAgICAgcmVkcmF3OiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zaXRpb246IHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDc1MCxcclxuICAgICAgICAgICAgZWFzZTogJ2N1YmljLWluLW91dCcsXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBjbGVhcl9vbl91bmhvdmVyOiBmYWxzZSxcclxuICAgIGNvbmZpZzoge30sXHJcbn07XHJcblxyXG5FeHRlbmRhYmxlR3JhcGgucHJvcFR5cGVzID0gZ3JhcGhQcm9wVHlwZXM7XHJcbkV4dGVuZGFibGVHcmFwaC5kZWZhdWx0UHJvcHMgPSBncmFwaERlZmF1bHRQcm9wcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV4dGVuZGFibGVHcmFwaDtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/lib/components/ExtendableGraph.react.js\n"); /***/ }), diff --git a/dash_extendable_graph/dash_extendable_graph.min.js b/dash_extendable_graph/dash_extendable_graph.min.js index 048ffee..b1e5246 100644 --- a/dash_extendable_graph/dash_extendable_graph.min.js +++ b/dash_extendable_graph/dash_extendable_graph.min.js @@ -1 +1 @@ -window.dash_extendable_graph=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e){t.exports=window.PropTypes},function(t,e){t.exports=window.React},function(t,e,n){"use strict";n.r(e);var r=n(1),o=n.n(r),a=n(0),i=n.n(a);function u(t){return null!=t&&"object"==typeof t&&!0===t["@@functional/placeholder"]}function l(t){return function e(n){return 0===arguments.length||u(n)?e:t.apply(this,arguments)}}function c(t){return function e(n,r){switch(arguments.length){case 0:return e;case 1:return u(n)?e:l(function(e){return t(n,e)});default:return u(n)&&u(r)?e:u(n)?l(function(e){return t(e,r)}):u(r)?l(function(e){return t(n,e)}):t(n,r)}}}function s(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}function f(t,e,n){for(var r=0,o=n.length;r=0;)p(e=g[n],t)&&!m(r,e)&&(r[r.length]=e),n-=1;return r}):l(function(t){return Object(t)!==t?[]:Object.keys(t)}),j=l(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function w(t,e,n,r){var o=s(t);function a(t,e){return x(t,e,n.slice(),r.slice())}return!f(function(t,e){return!f(a,e,t)},s(e),o)}function x(t,e,n,r){if(y(t,e))return!0;var o,a,i=j(t);if(i!==j(e))return!1;if(null==t||null==e)return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(a=String(o).match(/^function (\w*)/))?"":a[1]))return t===e;break;case"Boolean":case"Number":case"String":if(typeof t!=typeof e||!y(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!y(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var u=n.length-1;u>=0;){if(n[u]===t)return r[u]===e;u-=1}switch(i){case"Map":return t.size===e.size&&w(t.entries(),e.entries(),n.concat([t]),r.concat([e]));case"Set":return t.size===e.size&&w(t.values(),e.values(),n.concat([t]),r.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var l=O(t);if(l.length!==O(e).length)return!1;var c=n.concat([t]),s=r.concat([e]);for(u=l.length-1;u>=0;){var f=l[u];if(!p(f,e)||!x(e[f],t[f],c,s))return!1;u-=1}return!0}var P=c(function(t,e){return x(t,e,[],[])});function _(t,e){return function(t,e,n){var r,o;if("function"==typeof t.indexOf)switch(typeof e){case"number":if(0===e){for(r=1/e;n=0}var k=c(_),A=l(function(t){return null==t}),S=Array.isArray||function(t){return null!=t&&t.length>=0&&"[object Array]"===Object.prototype.toString.call(t)};function D(t){return null!=t&&"function"==typeof t["@@transducer/step"]}function E(t,e,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!S(o)){for(var a=0;a0&&(t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1)))))}),B=function(){function t(t){this.f=t}return t.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},t.prototype["@@transducer/result"]=function(t){return t},t.prototype["@@transducer/step"]=function(t,e){return this.f(t,e)},t}();var R=c(function(t,e){return function(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,n){return e.apply(this,arguments)};case 3:return function(t,n,r){return e.apply(this,arguments)};case 4:return function(t,n,r,o){return e.apply(this,arguments)};case 5:return function(t,n,r,o,a){return e.apply(this,arguments)};case 6:return function(t,n,r,o,a,i){return e.apply(this,arguments)};case 7:return function(t,n,r,o,a,i,u){return e.apply(this,arguments)};case 8:return function(t,n,r,o,a,i,u,l){return e.apply(this,arguments)};case 9:return function(t,n,r,o,a,i,u,l,c){return e.apply(this,arguments)};case 10:return function(t,n,r,o,a,i,u,l,c,s){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}(t.length,function(){return t.apply(e,arguments)})});function z(t,e,n){for(var r=n.next();!r.done;){if((e=t["@@transducer/step"](e,r.value))&&e["@@transducer/reduced"]){e=e["@@transducer/value"];break}r=n.next()}return t["@@transducer/result"](e)}function N(t,e,n,r){return t["@@transducer/result"](n[r](R(t["@@transducer/step"],t),e))}var q="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function I(t,e,n){if("function"==typeof t&&(t=function(t){return new B(t)}(t)),T(n))return function(t,e,n){for(var r=0,o=n.length;r=0;)p(e=v[n],t)&&!m(r,e)&&(r[r.length]=e),n-=1;return r}):l(function(t){return Object(t)!==t?[]:Object.keys(t)}),j=l(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function w(t,e,n,r){var o=s(t);function a(t,e){return x(t,e,n.slice(),r.slice())}return!f(function(t,e){return!f(a,e,t)},s(e),o)}function x(t,e,n,r){if(y(t,e))return!0;var o,a,u=j(t);if(u!==j(e))return!1;if(null==t||null==e)return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(u){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(a=String(o).match(/^function (\w*)/))?"":a[1]))return t===e;break;case"Boolean":case"Number":case"String":if(typeof t!=typeof e||!y(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!y(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var i=n.length-1;i>=0;){if(n[i]===t)return r[i]===e;i-=1}switch(u){case"Map":return t.size===e.size&&w(t.entries(),e.entries(),n.concat([t]),r.concat([e]));case"Set":return t.size===e.size&&w(t.values(),e.values(),n.concat([t]),r.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var l=O(t);if(l.length!==O(e).length)return!1;var c=n.concat([t]),s=r.concat([e]);for(i=l.length-1;i>=0;){var f=l[i];if(!p(f,e)||!x(e[f],t[f],c,s))return!1;i-=1}return!0}var _=c(function(t,e){return x(t,e,[],[])});function P(t,e){return function(t,e,n){var r,o;if("function"==typeof t.indexOf)switch(typeof e){case"number":if(0===e){for(r=1/e;n=0}var A=c(P),k=l(function(t){return null==t}),D=Array.isArray||function(t){return null!=t&&t.length>=0&&"[object Array]"===Object.prototype.toString.call(t)};function S(t){return null!=t&&"function"==typeof t["@@transducer/step"]}function T(t,e,n){return function(){if(0===arguments.length)return n();var r=Array.prototype.slice.call(arguments,0),o=r.pop();if(!D(o)){for(var a=0;a0&&(t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1)))))}),R=function(){function t(t){this.f=t}return t.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},t.prototype["@@transducer/result"]=function(t){return t},t.prototype["@@transducer/step"]=function(t,e){return this.f(t,e)},t}();var z=c(function(t,e){return function(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,n){return e.apply(this,arguments)};case 3:return function(t,n,r){return e.apply(this,arguments)};case 4:return function(t,n,r,o){return e.apply(this,arguments)};case 5:return function(t,n,r,o,a){return e.apply(this,arguments)};case 6:return function(t,n,r,o,a,u){return e.apply(this,arguments)};case 7:return function(t,n,r,o,a,u,i){return e.apply(this,arguments)};case 8:return function(t,n,r,o,a,u,i,l){return e.apply(this,arguments)};case 9:return function(t,n,r,o,a,u,i,l,c){return e.apply(this,arguments)};case 10:return function(t,n,r,o,a,u,i,l,c,s){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}(t.length,function(){return t.apply(e,arguments)})});function N(t,e,n){for(var r=n.next();!r.done;){if((e=t["@@transducer/step"](e,r.value))&&e["@@transducer/reduced"]){e=e["@@transducer/value"];break}r=n.next()}return t["@@transducer/result"](e)}function q(t,e,n,r){return t["@@transducer/result"](n[r](z(t["@@transducer/step"],t),e))}var B="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function L(t,e,n){if("function"==typeof t&&(t=function(t){return new R(t)}(t)),E(n))return function(t,e,n){for(var r=0,o=n.length;r