2.0.0-rc2
2.0.0
const graph = {
nodes: [
{
- id: 'id',
- color: 'red', // only this node will be red
+ id: "id",
+ color: "red", // only this node will be red
size: 300, // only this node will have size 300
- symbolType: 'diamond' // only this node will have 'diamond' shape
+ symbolType: "diamond" // only this node will have "diamond" shape
}
],
links: [...]
};
Index for config
(boolean
= false
)
🚅🚅🚅 when true performing a node drag and drop should automatically
-rearrange all nodes positions based on new position of dragged node (note:
+rearrange all nodes positions based on new position of dragged node (note:
staticGraph
should be false).
(boolean
= false
)
🚅🚅🚅 Allow leaf neighbors nodes to be collapsed (folded), this will allow users to clear the way out and focus on the parts of the graph that really matter.
-To see an example of this behavior you can access this sandbox link that has a specific set up to experiment this feature.
+To see an example of this behavior you can access this sandbox link that has a specific set up to experiment this feature.
NOTE
: At this moment
-nodes without connections (orphan nodes) are not rendered when this property is activated (see
+nodes without connections (orphan nodes) are not rendered when this property is activated (see
react-d3-graph/issues/#129
).
@@ -852,9 +886,9 @@ (number
+ = 1
)
+ zoom that will be applied when the graph view is focused in a node. Its value must be between
+
+minZoom
+ and
+maxZoom
+. If the specified
+focusZoom
+ is out of this range,
+minZoom
+ or
+maxZoom
+ will be applied instead.
+
+NOTE:
+ This animation is not trigger by default. In order to trigger it you need to pass down to
+react-d3-graph
+ the
+node that you want to focus via prop
+focusedNodeId
+ along side with nodes and links:
+const data = {
+ nodes: this.state.data.nodes,
+ links: this.state.data.links,
+ focusedNodeId: "nodeIdToTriggerZoomAnimation"
+};
+(number
+ = 0.75
)
+ duration (in seconds) for the animation that takes place when focusing the graph on a node.
+
+ (boolean
= false
)
🚅🚅🚅 when user mouse hovers a node that node and adjacent common
-connections will be highlighted (depending on the
+connections will be highlighted (depending on the
highlightDegree
- value). All the remaining nodes and links assume opacity value equal to
+ value). All the remaining nodes and links assume opacity value equal to
highlightOpacity
.
(boolean
= false
)
🚅🚅🚅 when the user mouse hovers some link that link and the correspondent nodes will be highlighted, this is a similar behavior
-to
+to
nodeHighlightBehavior
- but for links
+ but for links
-(just for historical reference this property was introduced in
+(just for historical reference this property was introduced in
v1.0.0
)
.
(number
= 1
)
Possible values: 0, 1 or 2
. This value represents the range of the
-highlight behavior when some node is highlighted. If the value is set to
+highlight behavior when some node is highlighted. If the value is set to
0
only the selected node will be
-highlighted. If the value is set to
+highlighted. If the value is set to
1
the selected node and his 1st degree connections will be highlighted. If
-the value is set to
+the value is set to
2
the selected node will be highlighted as well as the 1st and 2nd common degree connections.
(number
= 1
)
this value is used to highlight nodes in the network. The lower
-the value the more the less highlighted nodes will be visible (related to
+the value the more the less highlighted nodes will be visible (related to
nodeHighlightBehavior
).
(number
- = 1
)
- zoom that will be applied when the graph view is focused in a node. Its value must be between
-
-minZoom
- and
-maxZoom
-. If the specified
-focusZoom
- is out of this range,
-minZoom
- or
-maxZoom
- will be applied instead.
-
-NOTE:
- This animation is not trigger by default. In order to trigger it you need to pass down to
-react-d3-graph
- the
-node that you want to focus via prop
-focusedNodeId
- along side with nodes and links:
-const data = {
- nodes: this.state.data.nodes,
- links: this.state.data.links,
- focusedNodeId: 'nodeIdToTriggerZoomAnimation'
-};
-(number
- = 0.75
)
- duration (in seconds) for the animation that takes place when focusing the graph on a node.
- (boolean
= false
)
when setting this value to true the graph will be completely static, thus
all forces and drag events upon nodes will produce not effect. Note that, if this value is true the nodes will be
-rendered with the initial provided
+rendered with the initial provided
x and y coordinates
(links positions will be automatically set
from the given nodes positions by rd3g), no coordinates will be calculated by rd3g or subjacent d3 modules.
d3.alphaTarget number
-
+
(default 0.05 )
|
see d3-force simulation.alphaTarget
@@ -1084,10 +1118,10 @@ # d3 level configurations |
d3.gravity number
-
+
(default -100 )
|
this will define how close nodes are to each other (
@@ -1095,16 +1129,16 @@ # d3 level configurations).
|
d3.linkLength number
-
+
(default 100 )
|
the length of each link from the center of the nodes it joins.
@@ -1112,10 +1146,10 @@ # d3 level configurations |
d3.linkStrength number
-
+
(default 1 )
|
see d3-force link.strength
@@ -1126,12 +1160,12 @@ # d3 level configurations |
node.color string
-
- (default '#d3d3d3' )
+
+ (default "#d3d3d3" )
|
- 🔍🔍🔍 this is the color that will be applied to the node if no + | 🔍🔍🔍 this is the color that will be applied to the node if no color property -is found inside the node itself (yes -you can pass a property 'color' inside the node and that color will override the +is found inside the node itself (yes +you can pass a property "color" inside the node and that color will override the this default one ). |
node.fontColor string
-
- (default 'black' )
+
+ (default "black" )
|
- 🔍🔍🔍 fill color for node's + | 🔍🔍🔍 fill color for node"s
|
node.fontSize number
-
- (default 10 )
+
+ (default 8 )
|
font-size -property for all nodes' labels. +property for all nodes" labels. | |
node.fontWeight string
-
- (default 'normal' )
+
+ (default "normal" )
|
font-weight -property for all nodes' labels. +property for all nodes" labels. | |
node.highlightColor string
-
- (default 'SAME' )
+
+ (default "SAME" )
|
- color for all highlighted nodes (use string 'SAME' if you + | color for all highlighted nodes (use string "SAME" if you want the node to keep its color in highlighted state). |
node.highlightFontSize number
-
+
(default 8 )
|
fontSize in highlighted state.
@@ -1231,59 +1265,59 @@ # Node level configurations | |
node.highlightFontWeight string
-
- (default 'normal' )
+
+ (default "normal" )
|
fontWeight in highlighted state. | |
node.highlightStrokeColor string
-
- (default 'SAME' )
+
+ (default "SAME" )
|
strokeColor in highlighted state. | |
node.highlightStrokeWidth number
-
- (default 1.5 )
+
+ (default "SAME" )
|
strokeWidth in highlighted state. | |
node.labelProperty (string | Function)
-
- (default 'id' )
+
+ (default "id" )
|
this is the node property that will be used in runtime to
fetch the label content. You just need to add some property (e.g. firstName) to the node payload and then set
-node.labelProperty to be
-'firstName'
-.
+node.labelProperty to be
+"firstName"
+.
This can also be a function!
, if you pass a function here it will be called
-to obtain the
+to obtain the
label
value on the fly, as a client you will receive all the node information that you passed down into react-d3-graph,
so the signature of the function would be:
function myCustomLabelBuilder(node) {
// do stuff to get the final result...
- return 'label string';
+ return "label string";
}
Then you just need to make sure that you pass this function in the config in # Node level configurations | |
node.mouseCursor string
-
- (default 'pointer' )
+
+ (default "pointer" )
|
cursor
@@ -1304,21 +1338,21 @@ # Node level configurations | |
node.opacity number
-
+
(default 1 )
|
- by default all nodes will have this opacity value. + | 🔍🔍🔍 - by default all nodes will have this opacity value. |
node.renderLabel boolean
-
+
(default true )
|
when set to false no labels will appear along side nodes in the
@@ -1327,10 +1361,10 @@ # Node level configurations | |
node.size number
-
+
(default 200 )
|
🔍🔍🔍 defines the size of all nodes.
@@ -1338,39 +1372,39 @@ # Node level configurations | |
node.strokeColor string
-
- (default 'none' )
+
+ (default "none" )
|
- 🔍🔍🔍 this is the stroke color that will be applied to the node if no + | 🔍🔍🔍 this is the stroke color that will be applied to the node if no strokeColor property - is found inside the node itself (yes -you can pass a property 'strokeColor' inside the node and that stroke color will override this default one + is found inside the node itself (yes +you can pass a property "strokeColor" inside the node and that stroke color will override this default one ). |
node.strokeWidth number
-
+
(default 1.5 )
|
- the width of the all node strokes. + | 🔍🔍🔍 - the width of the all node strokes. |
node.svg string
-
- (default '' )
+
+ (default "" )
|
- 🔍🔍🔍 render custom svg for nodes in alternative to + | 🔍🔍🔍 render custom svg for nodes in alternative to
node.symbolType
. This svg can
be provided as a string to either a remote svg resource or for a local one.
@@ -1383,38 +1417,38 @@ # Node level configurations |
node.symbolType string
-
- (default 'circle' )
+
+ (default "circle" )
|
- 🔍🔍🔍 the - + | 🔍🔍🔍 the
+
shape
of the node.
-Use the following values under a property
+Use the following values under a property
type
inside each node (nodes may have different types, same as colors):
[note] react-d3-graph will map this values to d3 symbols |
node.viewGenerator Function
-
+
(default null )
|
🔍🔍🔍 function that receives a node and returns a JSX view.
@@ -1424,12 +1458,12 @@ # Node level configurations |
link.color string
-
- (default '#d3d3d3' )
+
+ (default "#d3d3d3" )
|
- 🚅🚅🚅 the color for links + | 🔍🔍🔍 the color for links (from version 1.3.0 this property can be configured at link level). | |
link.highlightColor string
-
- (default '#d3d3d3' )
- |
- links' color in highlight state. + | link.fontColor string
-![]() "black" )
+ |
+ 🔍🔍🔍 fill color for link's
+ |
link.mouseCursor string
-
- (default 'pointer' )
+ | link.fontSize number
+
+ (default 8 )
|
- cursor + | font-size -property for when link is mouse hovered. +property for all links' labels. |
link.opacity number
-
- (default 1 )
+ | link.fontWeight string
+
+ (default "normal" )
|
- the default opacity value for links. + | font-weight + +property for all links' labels. |
link.highlightColor string
+
+ (default "#d3d3d3" )
+ |
+ links' color in highlight state.
+
+![]() |
+||
link.highlightFontSize number
+
+ (default 8 )
+ |
+ fontSize in highlighted state. + | +||
link.highlightFontWeight string
+
+ (default "normal" )
+ |
+ fontWeight in highlighted state. + | +||
link.labelProperty boolean
+
+ (default "label" )
+ |
+ the property that will be rendered as label within some link. Note that +this property needs to be passed along the link payload (along side with source and target). + | +||
link.mouseCursor string
+
+ (default "pointer" )
+ |
+ cursor + +property for when link is mouse hovered. + | +||
link.opacity number
+
+ (default 1 )
+ |
+ 🔍🔍🔍 - the default opacity value for links. + | +||
link.renderLabel boolean
+
+ (default false )
+ |
+ when set to true labels will appear along side links in the
+graph.
+Note
+: this will only happen of course if proper label is passed within the link, check also
+link.labelProperty
+.
+
++ + + ![]() |
+||
link.semanticStrokeWidth boolean
-
+
(default false )
|
when set to true all links will have
@@ -1515,94 +1643,95 @@ # Link level configurations | ||
link.strokeWidth number
-
+
(default 1.5 )
|
- strokeWidth for all links. By default the actual value is obtain by the + | 🔍🔍🔍 - strokeWidth for all links. By default the actual value is obtain by the
following expression:
link.strokeWidth * (1 / transform); // transform is a zoom delta Δ value
|
|
link.type string
-
- (default 'STRAIGHT' )
+
+ (default "STRAIGHT" )
|
the type of line to draw, available types at this point are:
+ ![]() |
// A simple config that uses some properties
const myConfig = {
nodeHighlightBehavior: true,
node: {
- color: 'lightgreen',
+ color: "lightgreen",
size: 120,
- highlightStrokeColor: 'blue'
+ highlightStrokeColor: "blue"
},
link: {
- highlightColor: 'lightblue'
+ highlightColor: "lightblue"
}
};
-// Sorry for the long config description, here's a potato 🥔.
-
-
+// Sorry for the long config description, here"s a potato 🥔.
+
+
+
+
+
-
-
-
Graph component is the main component for react-d3-graph components, its interface allows its user to build the graph once the user provides the data, configuration (optional) and callback interactions (also optional). @@ -1611,48 +1740,48 @@
Extends - + React.Component - +
- - - - - - - - + + + + + + + +(any)
-
+
import { Graph } from 'react-d3-graph';
// graph payload (with minimalist structure)
@@ -1732,15 +1861,71 @@
onMouseOutNode={onMouseOutNode}
onMouseOverLink={onMouseOverLink}
onMouseOutLink={onMouseOutLink}/>
-
-
-
-
+
+
+
+
Obtain a set of properties which will be used to perform the focus and zoom animation if +required. In case there's not a focus and zoom animation in progress, it should reset the +transition duration to zero and clear transformation styles.
+ + +Object
:
+ Focus and zoom animation properties.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Handles d3 drag 'end' event.
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Handles d3 'drag' event. more about d3 drag
(Object)
if not undefined it will contain event data.
(number)
index of the node that is being dragged.
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Handles d3 drag 'start' event.
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Sets nodes and links highlighted value.
(string)
the id of the node to highlight.
(boolean
@@ -2037,38 +2222,38 @@
the highlight value to be set (true or false).
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
The tick function simply calls React set state in order to update component and render nodes along time as d3 calculates new node positioning.
(Object
@@ -2107,49 +2292,49 @@
new state to pass on.
(Function?)
- optional callback to fed in to
+ optional callback to fed in to
https://reactjs.org/docs/react-component.html#setstate
.
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Configures zoom upon graph with default or user provided values.
https://github.com/d3/d3-zoom#zoom
undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Handler for 'zoom' event within zoom config.
Object
:
returns the transformed elements within the svg graph area.
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
Handles mouse over node event.
+ +Calls the callback passed to the component.
+ + +undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Handles mouse out node event.
+ +Collapses the nodes, then calls the callback passed to the component.
+ + +undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Handles mouse over link event.
+ +Handles mouse over node event.
+ + +(string)
- id of the source node that participates in the event.
- undefined
:
-
-
-
-
-
-
-
-
-
-Handles mouse out link event.
+ +Handles mouse out node event.
+ + +(string)
- id of the source node that participates in the event.
- undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Calls d3 simulation.stop().
-https://github.com/d3/d3-force#simulation_stop
Handles mouse over link event.
-undefined
:
-
-
-
-
-
-
-
-
-
-(string)
+ id of the source node that participates in the event.
+
+ (string)
+ id of the target node that participates in the event.
- This method resets all nodes fixed positions by deleting the properties fx (fixed x) -and fy (fixed y). Following this, a simulation is triggered in order to force nodes to go back -to their original positions (or at least new positions according to the d3 force parameters).
+undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Calls d3 simulation.restart().
-https://github.com/d3/d3-force#simulation_restart
Handles mouse out link event.
-undefined
:
-
-
-
-
-
-
-
-
-
-(string)
+ id of the source node that participates in the event.
-
-
-
+ componentWillReceiveProps
- has a replacement method in react v16.3 onwards.
-that is getDerivedStateFromProps.
-But one needs to be aware that if an anti pattern of
-componentWillReceiveProps
- is
-in place for this implementation the migration might not be that easy.
-See
-https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html
-.
-undefined
:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Collapses the nodes, then calls the callback passed to the component.
+Calls d3 simulation.stop().
+https://github.com/d3/d3-force#simulation_stop
(string)
- The id of the node where the click was performed.
- undefined
:
-
-
-
-
-
-
-
-
-
-Obtain a set of properties which will be used to perform the focus and zoom animation if -required. In case there's not a focus and zoom animation in progress, it should reset the -transition duration to zero and clear transformation styles.
+This method resets all nodes fixed positions by deleting the properties fx (fixed x) +and fy (fixed y). Following this, a simulation is triggered in order to force nodes to go back +to their original positions (or at least new positions according to the d3 force parameters).
-Object
:
- Focus and zoom animation properties.
-
-
-
-
-
-
-
-
-Offers a series of methods that isolate logic of Graph component and also from Graph rendering methods.
+undefined
:
- - Type: - Object -
- - +Calls d3 simulation.restart().
+https://github.com/d3/d3-force#simulation_restart
(string)
- : the id of the node.
-
- (string?)
- : color of the node (optional).
-
- (string?)
- : node text label font color (optional).
-
- (string?)
- : size of the node (optional).
-
- (string?)
- : symbol type of the node (optional).
-
- (string?)
- : custom svg for node (optional).
-
- Create d3 forceSimulation to be applied on the graph.
-d3-force#forceSimulation
-d3-force#simulation_force
-Wtf is a force? here
componentWillReceiveProps
+ has a replacement method in react v16.3 onwards.
+that is getDerivedStateFromProps.
+But one needs to be aware that if an anti pattern of
+componentWillReceiveProps
+ is
+in place for this implementation the migration might not be that easy.
+See
+https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html
+.
+(number)
- the width of the container area of the graph.
- (number)
- the force strength applied to the graph.
- Object
:
- returns the simulation instance to be consumed.
+ undefined
:
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Get the correct node opacity in order to properly make decisions based on context such as currently highlighted node.
-(Object)
- the node object for whom we will generate properties.
- Offers a series of methods that isolate render logic for Graph component.
- - +Receives a matrix of the graph with the links source and target as concrete node instances and it transforms it -in a lightweight matrix containing only links with source and target being strings representative of some node id -and the respective link value (if non existent will default to 1).
- - - - - - - - - - -(Object)
- the graph config.
- Object<string, Object>
:
- an object containing a matrix of connections of the graph, for each nodeId,
-there is an object that maps adjacent nodes ids (string) and their values (number).
-
-
-
-
-
-
-
-
-Method that initialize graph nodes provided by rd3g consumer and adds additional default mandatory properties -that are optional for the user. Also it generates an index mapping, this maps nodes ids the their index in the array -of nodes. This is needed because d3 callbacks such as node click and link click return the index of the node.
+Build Link components given a list of links.
- - - - - - - - - +Object<string, Object>
:
- returns the nodes ready to be used within rd3g with additional properties such as x, y
-and highlighted values.
-
-
-
-
-
-
-
-
-Maps an input link (with format { source: 'sourceId', target: 'targetId' }
) to a d3Link
-(with format { source: { id: 'sourceId' }, target: { id: 'targetId' } }
). If d3Link with
-given index exists already that same d3Link is returned.
(Array<Object>
- = []
)
- all d3Links.
+ linkCallbacks (Array<Function>)
+ same as
+linkCallbacks in renderGraph
+.
(Object)
- same as
-config in buildGraph
+ highlightedNode (string)
+ same as
+highlightedNode in renderGraph
.
(Object
- = {}
)
- Graph component current state (same format as returned object on this function).
+ highlightedLink (Object)
+ same as
+highlightedLink in renderGraph
+.
Array<Object>
:
+ returns the generated array of Link components.
- Some integrity validations on links and nodes structure. If some validation fails the function will -throw an error.
- - - - - - - - - - -undefined
:
-
-
-
-
-
- Build some Link properties based on given parameters.
+ +Function that builds Node components.
+ + +(Object)
- the link object for which we will generate properties.
- (Object<string, Object>)
- same as
-nodes in buildGraph
-.
+ an object containing all nodes mapped by their id.
(Object)
- same as
-config in buildGraph
-.
+ an object containing rd3g consumer defined configurations
+config
+ for the graph.
(string)
- same as
-highlightedNode in buildGraph
-.
+ this value contains a string that represents the some currently highlighted node.
(Object)
- same as
-highlightedLink in buildGraph
-.
+ this object contains a source and target property for a link that is highlighted at some point in time.
Name | +Description | +
---|---|
highlightedLink.source string
+ |
+ id of source node for highlighted link. + | +
highlightedLink.target string
+ |
+ id of target node for highlighted link. + | +
(number)
value that indicates the amount of zoom transformation.
Object
:
- returns an object that aggregates all props for creating respective Link component instance.
+ Array<Object>
:
+ returns the generated array of node components
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Build some Node properties based on given parameters.
+ +Builds graph defs (for now markers, but we could also have gradients for instance). +NOTE: defs are static svg graphical objects, thus we only need to render them once, the result +is cached on the 1st call and from there we simply return the cached jsx.
+ + +(Object)
- the node object for whom we will generate properties.
- (number)
- value that indicates the amount of zoom transformation.
- Object
:
- returns object that contain Link props ready to be feeded to the Link component.
+ Function
:
+ memoized build definitions function.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
This function checks for graph elements (nodes and links) changes, in two different -levels of significance, updated elements (whether some property has changed in some -node or link) and new elements (whether some new elements or added/removed from the graph).
+ +Memoized reference for _renderDefs.
+ + +(Object)
- nextProps that graph will receive.
- Object<string, boolean>
:
- returns object containing update check flags:
-Object
:
+ graph reusable objects
+defs
+.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Logic to check for changes in graph config.
+ +Method that actually is exported an consumed by Graph component in order to build all Nodes and Link +components.
+ + +(Object<string, Object>)
+ an object containing a matrix of connections of the graph, for each nodeId,
+there is an Object that maps adjacent nodes ids (string) and their values (number).
+ // links example
+ {
+ "Androsynth": {
+ "Chenjesu": 1,
+ "Ilwrath": 1,
+ "Mycon": 1,
+ "Spathi": 1,
+ "Umgah": 1,
+ "VUX": 1,
+ "Guardian": 1
+ },
+ "Chenjesu": {
+ "Androsynth": 1,
+ "Mycon": 1,
+ "Spathi": 1,
+ "Umgah": 1,
+ "VUX": 1,
+ "Broodhmome": 1
+ },
+ ...
+ }
-
+ (string)
+ this value contains a string that represents the some currently highlighted node.
+
+ (Object)
- Graph component props, object that holds data, id and config.
+ highlightedLink (Object)
+ this object contains a source and target property for a link that is highlighted at some point in time.
props.data Object
- |
- Data object holds links (array of -Link -) and nodes (array of -Node -). - | -||
props.id string
+ | highlightedLink.source string
|
- the graph id. + | id of source node for highlighted link. |
props.config Object
+ | highlightedLink.target string
|
- same as -config in buildGraph -. + | id of target node for highlighted link. |
Object
:
- a fully (re)initialized graph state object.
+ returns an object containing the generated nodes and links that form the graph.
-
-
-
-
-
-
-
-
-(string)
- identifier of node to update.
- (string
- = false
)
- new highlight value for given node.
- Object
:
- returns an object containing the updated nodes
-and the id of the highlighted node.
-
-
-
+
-
-
-
-
+ Offers a series of methods that isolate the way graph elements are built (nodes and links mainly).
+ + +Returns the transformation to apply in order to center the graph on the -selected node.
+ +Get the correct node opacity in order to properly make decisions based on context such as currently highlighted node.
+ + +string
:
- transform rule to apply.
+ number
:
+ the opacity value for the given node.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Build Link components given a list of links.
+ +Build some Link properties based on given parameters.
+ + +(Object<string, Object>)
- same as
-nodes in buildGraph
-.
+ link (Object)
+ the link object for which we will generate properties.
(Array<Function>)
- same as
-linkCallbacks in buildGraph
+ same as
+linkCallbacks in renderGraph
.
(string)
- same as
-highlightedNode in buildGraph
+ same as
+highlightedNode in renderGraph
.
(Object)
- same as
-highlightedLink in buildGraph
+ same as
+highlightedLink in renderGraph
.
(number)
value that indicates the amount of zoom transformation.
Array<Object>
:
- returns the generated array of Link components.
+ Object
:
+ returns an object that aggregates all props for creating respective Link component instance.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Function that builds Node components.
+ +Build some Node properties based on given parameters.
+ + +(Array<Function>)
- array of callbacks for used defined event handler for node interactions.
+ config (Object)
+ same as
+config in renderGraph
+.
(Object)
- an object containing rd3g consumer defined configurations
-config
- for the graph.
+ nodeCallbacks (Array<Function>
+ = {}
)
+ same as
+nodeCallbacks in renderGraph
+.
(string)
- this value contains a string that represents the some currently highlighted node.
+ same as
+highlightedNode in renderGraph
+.
(Object)
- this object contains a source and target property for a link that is highlighted at some point in time.
+ same as
+highlightedLink in renderGraph
+.
Name | -Description | -
---|---|
highlightedLink.source string
- |
- id of source node for highlighted link. - | -
highlightedLink.target string
- |
- id of target node for highlighted link. - | -
(number)
value that indicates the amount of zoom transformation.
Array<Object>
:
- returns the generated array of node components
+ Object
:
+ returns object that contain Link props ready to be feeded to the Link component.
-
-
-
-
-
-
-
-
-Builds graph defs (for now markers, but we could also have gradients for instance). -NOTE: defs are static svg graphical objects, thus we only need to render them once, the result -is cached on the 1st call and from there we simply return the cached jsx.
-Function
:
- memoized build definitions function.
+ Memoized reference for _buildDefs.
+Object
:
- graph reusable objects
-defs
-.
-
-
-
+ Offers a series of methods that isolate logic of Graph component and also from Graph rendering methods.
+ + +Offers a series of methods that isolate render logic for Graph component.
-Method that actually is exported an consumed by Graph component in order to build all Nodes and Link -components.
-(Object<string, Object>)
- an object containing all nodes mapped by their id.
+ + Type: + Object +
+ + + + + + + + + + + + + +(Object<string, Object>)
- an object containing a matrix of connections of the graph, for each nodeId,
-there is an Object that maps adjacent nodes ids (string) and their values (number).
- // links example
- {
- "Androsynth": {
- "Chenjesu": 1,
- "Ilwrath": 1,
- "Mycon": 1,
- "Spathi": 1,
- "Umgah": 1,
- "VUX": 1,
- "Guardian": 1
- },
- "Chenjesu": {
- "Androsynth": 1,
- "Mycon": 1,
- "Spathi": 1,
- "Umgah": 1,
- "VUX": 1,
- "Broodhmome": 1
- },
- ...
- }
+ fontColor (string?)
+ : node text label font color (optional).
+
- (Object)
- this object contains a source and target property for a link that is highlighted at some point in time.
- Name | -Description | -
---|---|
highlightedLink.source string
- |
- id of source node for highlighted link. - | -
highlightedLink.target string
- |
- id of target node for highlighted link. - | -
(number)
- value that indicates the amount of zoom transformation.
- Object
:
- returns an object containing the generated nodes and links that form the graph.
-
-
-
-
-
-
-
-
Offers a series of methods that allow graph to perform the necessary operations to -create the collapsible behavior.
-Developer notes - collapsing nodes and maintaining state on links matrix.
-User interaction flow (for a collapsible graph) -1. User clicks node -2. All leaf connections of that node are not rendered anymore -3. User clicks on same node -4. All leaf connections of that node are rendered
-Internal react-d3-graph flow -1. User clicks node -2. Compute leaf connections for clicked node (rootNode, root as in 'root' of the event) -3. Update connections matrix (based on 2.) -4. Update d3Links array with toggled connections (based on 2.)
++ Type: + Object +
-For directed graphs. -Check based on node degrees whether it is a leaf node or not.
- - - - - - - - - +boolean
:
- based on the degrees tells whether node is leaf or not.
-
-
-
-
-
-
-
-
+
+
+
+
+
For not directed graphs. -Check based on node degrees whether it is a leaf node or not.
+ +Create d3 forceSimulation to be applied on the graph.
+d3-force#forceSimulation
+d3-force#simulation_force
+Wtf is a force? here
boolean
:
- based on the degrees tells whether node is leaf or not.
+ Object
:
+ returns the simulation instance to be consumed.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Given in and out degree tells whether degrees indicate a leaf or non leaf scenario.
+ +Receives a matrix of the graph with the links source and target as concrete node instances and it transforms it +in a lightweight matrix containing only links with source and target being strings representative of some node id +and the respective link value (if non existent will default to 1).
+ + + + + + + + + + - - - - - - - - - -(string)
- The id of the node to get the cardinality of.
- boolean
:
- flag that indicates whether node is leaf or not.
+ Object<string, Object>
:
+ an object containing a matrix of connections of the graph, for each nodeId,
+there is an object that maps adjacent nodes ids (string) and their values (number).
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Calculates degree (in and out) of some provided node.
+ +Method that initialize graph nodes provided by rd3g consumer and adds additional default mandatory properties +that are optional for the user. Also it generates an index mapping, this maps nodes ids the their index in the array +of nodes. This is needed because d3 callbacks such as node click and link click return the index of the node.
+ + + + + + + + + + -Object<string, number>
:
- returns object containing in and out degree of the node:
-Object<string, Object>
:
+ returns the nodes ready to be used within rd3g with additional properties such as x, y
+and highlighted values.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Given a node id we want to calculate the list of leaf connections
+Maps an input link (with format { source: 'sourceId', target: 'targetId' }
) to a d3Link
+(with format { source: { id: 'sourceId' }, target: { id: 'targetId' } }
). If d3Link with
+given index exists already that same d3Link is returned.
(string)
- node who's leafs we want to calculate.
- (Object)
+ input link.
+
+ Array<Object<string, string>>
:
- a list of leaf connections.
-What is a leaf connection? A leaf connection is a link between some node A and other node B
-where A has id equal to rootNodeId and B has inDegree 1 and outDegree 0 (or outDegree 1 but the connection is with A).
+ Object
:
+ a d3Link.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Given a node and the connections matrix, check if node should be displayed
-NOTE: this function is meant to be used under the collapsible
toggle, meaning
-that the isNodeVisible
actually is checking visibility on collapsible graphs.
-If you think that this code is confusing and could potentially collide (🤞) with #_isLeaf
-always remember that A leaf can, through time, be both a visible or an invisible node!.
Tags orphan nodes with a _orphan
flag.
(Object<string, number>)
- An object containing a matrix of connections of the nodes.
+ linksMatrix (Object<string, Object>)
+ an object containing a matrix of connections of the graph, for each nodeId,
+there is an object that maps adjacent nodes ids (string) and their values (number).
boolean
:
- flag that indicates whether node should or not be displayed.
+ Object<string, Object>
:
+ same input nodes structure with tagged orphans nodes where applicable.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Updates d3Links by toggling given connections
+ +Some integrity validations on links and nodes structure. If some validation fails the function will +throw an error.
+ + + + + + + + + + -Array<Object>
:
- updated d3Links.
+ undefined
:
+
+
+
+
+
+
+
+ Update matrix given array of connections to toggle.
+ +This function checks for graph elements (nodes and links) changes, in two different +levels of significance, updated elements (whether some property has changed in some +node or link) and new elements (whether some new elements or added/removed from the graph).
+ + + + + + + + + + -(Object)
- same as
-config in buildGraph
-.
+ currentState (Object)
+ the current state of the graph.
Name | -Description | -
---|---|
config.directed boolean
- |
- tells whether linksMatrix represents a directed graph or not. - | -
Object<string, Object>
:
- updated linksMatrix
+ Object<string, boolean>
:
+ returns object containing update check flags:
+Logic to check for changes in graph config.
- -Node component is responsible for encapsulating node render.
+ -- Extends - - React.Component - -
- - - - - - - - - - - - -const onClickNode = function(nodeId) {
- window.alert('Clicked node', nodeId);
-};
-const onRightClickNode = function(nodeId) {
- window.alert('Right clicked node', nodeId);
-}
-const onMouseOverNode = function(nodeId) {
- window.alert('Mouse over node', nodeId);
-};
-const onMouseOutNode = function(nodeId) {
- window.alert('Mouse out node', nodeId);
-};
+ Parameters
+
-<Node
- id='nodeId'
- cx=22
- cy=22
- fill='green'
- fontSize=10
- fontColor='black'
- fontWeight='normal'
- dx=90
- label='label text'
- opacity=1
- renderLabel=true
- size=200
- stroke='none'
- strokeWidth=1.5
- svg='assets/my-svg.svg'
- type='square'
- viewGenerator=(node) => <CustomComponent node={node} />
- className='node'
- onClickNode={onClickNode}
- onRightClickNode={onRightClickNode}
- onMouseOverNode={onMouseOverNode}
- onMouseOutNode={onMouseOutNode} />
-
-
+
+
+ nextProps (Object)
+ nextProps that graph will receive.
-
+
-
- Instance Members
-
-
-
-
-
- ▸
- handleOnClickNode
-
-
-
-
+
+
+ currentState (Object)
+ the current state of the graph.
+
+
- Handle click on the node.
+
+
+
- handleOnClickNode
-
-
-
-
-
-
-
-
-
-
-
-
Returns
- undefined
:
-
+ Object<string, boolean>
:
+ returns object containing update check flags:
+
+- configUpdated - global flag that indicates if any property was updated.
+- d3ConfigUpdated - specific flag that indicates changes in d3 configurations.
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
-
- Handle right click on the node.
+
+ Returns the transformation to apply in order to center the graph on the
+selected node.
+
+
+
+
+
+
+
+
+
+
- handleOnRightClickNode
-
-
-
-
-
-
-
-
-
Parameters
-
+
+
+
+
-
+
-
+
-
-
-
-
+
+
+
+
Returns
- undefined
:
-
+ string
:
+ transform rule to apply.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
- ▸
- handleOnMouseOutNode
-
-
-
-
-
+ Parameters
+
- Handle mouse out node event.
+
+
+ props (Object)
+ Graph component props, object that holds data, id and config.
+
- handleOnMouseOutNode
-
-
+
+
+
+
+
+
+
+ Name
+ Description
+
+
+
+
+
+ props.data Object
+
+ Data object holds links (array of
+Link
+) and nodes (array of
+Node
+).
+
+
-
-
-
-
-
-
-
-
+
+ props.id string
+
+ the graph id.
+
+
-
-
- Returns
- undefined
:
-
-
-
-
-
+
+ props.config Object
+
+ same as
+config in renderGraph
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ state (Object)
+ Graph component current state (same format as returned object on this function).
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object
:
+ a fully (re)initialized graph state object.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ updateNodeHighlightedValue(nodes, links, config, id, value)
+
+
+
+
+
+
+
+ This function updates the highlighted value for a given node and also updates highlight props.
+
+
+ updateNodeHighlightedValue(nodes: Object<string, Object>, links: Object<string, Object>, config: Object, id: string, value: string): Object
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id (string)
+ identifier of node to update.
+
+
+
+
+
+
+
+ value (string
+ = false
)
+ new highlight value for given node.
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object
:
+ returns an object containing the updated nodes
+and the id of the highlighted node.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Graph/collapse-helper
+
+
+
+
+
+
+ Offers a series of methods that allow graph to perform the necessary operations to
+create the collapsible behavior.
+Developer notes - collapsing nodes and maintaining state on links matrix.
+User interaction flow (for a collapsible graph)
+1. User clicks node
+2. All leaf connections of that node are not rendered anymore
+3. User clicks on same node
+4. All leaf connections of that node are rendered
+Internal react-d3-graph flow
+1. User clicks node
+2. Compute leaf connections for clicked node (rootNode, root as in 'root' of the event)
+3. Update connections matrix (based on 2.)
+4. Update d3Links array with toggled connections (based on 2.)
+
+
+ Graph/collapse-helper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Static Members
+
+
+
+
+
+ ▸
+ _isLeafDirected(inDegree, outDegree)
+
+
+
+
+
+
+
+ For directed graphs.
+Check based on node degrees whether it is a leaf node or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ inDegree (number)
+ the in degree for a given node.
+
+
+
+
+
+
+
+ outDegree (number)
+ the out degree for a given node.
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ boolean
:
+ based on the degrees tells whether node is leaf or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ _isLeafNotDirected(inDegree, outDegree)
+
+
+
+
+
+
+
+ For not directed graphs.
+Check based on node degrees whether it is a leaf node or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ inDegree (number)
+ the in degree for a given node.
+
+
+
+
+
+
+
+ outDegree (number)
+ the out degree for a given node.
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ boolean
:
+ based on the degrees tells whether node is leaf or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ _isLeaf(nodeId, linksMatrix, directed)
+
+
+
+
+
+
+
+ Given in and out degree tells whether degrees indicate a leaf or non leaf scenario.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ nodeId (string)
+ The id of the node to get the cardinality of.
+
+
+
+
+
+
+
+
+
+
+
+
+ directed (boolean)
+ whether graph in context is directed or not.
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ boolean
:
+ flag that indicates whether node is leaf or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ computeNodeDegree(nodeId, linksMatrix)
+
+
+
+
+
+
+
+ Calculates degree (in and out) of some provided node.
+
+
+ computeNodeDegree(nodeId: (string | number), linksMatrix: Object<string, Object>): Object<string, number>
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object<string, number>
:
+ returns object containing in and out degree of the node:
+
+- inDegree: number
+- outDegree: number
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ getTargetLeafConnections(rootNodeId, linksMatrix, config)
+
+
+
+
+
+
+
+ Given a node id we want to calculate the list of leaf connections
+
+
+ getTargetLeafConnections(rootNodeId: string, linksMatrix: Object<string, Object>, config: Object): Array<Object<string, string>>
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ rootNodeId (string)
+ node who's leafs we want to calculate.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name
+ Description
+
+
+
+
+
+ config.directed boolean
+
+ tells whether linksMatrix represents a directed graph or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Array<Object<string, string>>
:
+ a list of leaf connections.
+What is a leaf connection? A leaf connection is a link between some node A and other node B
+where A has id equal to rootNodeId and B has inDegree 1 and outDegree 0 (or outDegree 1 but the connection is with A).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ isNodeVisible(nodeId, nodes, linksMatrix)
+
+
+
+
+
+
+
+ Given a node and the connections matrix, check if node should be displayed
+NOTE: this function is meant to be used under the collapsible
toggle, meaning
+that the isNodeVisible
actually is checking visibility on collapsible graphs.
+If you think that this code is confusing and could potentially collide (🤞) with #_isLeaf
+always remember that A leaf can, through time, be both a visible or an invisible node!.
+
+
+ isNodeVisible(nodeId: string, nodes: Object<string, Object>, linksMatrix: Object<string, number>): boolean
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ nodeId (string)
+ The id of the node to get the cardinality of
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ boolean
:
+ flag that indicates whether node should or not be displayed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ toggleLinksConnections(d3Links, connectionMatrix)
+
+
+
+
+
+
+
+ Updates d3Links by toggling given connections
+
+
+ toggleLinksConnections(d3Links: Array<Object>, connectionMatrix: Array<Object<string, string>>): Array<Object>
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Array<Object>
:
+ updated d3Links.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ toggleLinksMatrixConnections(linksMatrix, connections, config)
+
+
+
+
+
+
+
+ Update matrix given array of connections to toggle.
+
+
+ toggleLinksMatrixConnections(linksMatrix: Object<string, Object>, connections: Array<Object<string, string>>, config: Object): Object<string, Object>
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name
+ Description
+
+
+
+
+
+ config.directed boolean
+
+ tells whether linksMatrix represents a directed graph or not.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object<string, Object>
:
+ updated linksMatrix
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Node
+
+
+
+
+
+
+ Node component is responsible for encapsulating node render.
+
+
+ new Node()
+
+
+
+ Extends
+
+ React.Component
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Example
+
+
+ const onClickNode = function(nodeId) {
+ window.alert('Clicked node', nodeId);
+};
+
+const onRightClickNode = function(nodeId) {
+ window.alert('Right clicked node', nodeId);
+}
+
+const onMouseOverNode = function(nodeId) {
+ window.alert('Mouse over node', nodeId);
+};
+
+const onMouseOutNode = function(nodeId) {
+ window.alert('Mouse out node', nodeId);
+};
+
+<Node
+ id='nodeId'
+ cx=22
+ cy=22
+ fill='green'
+ fontSize=10
+ fontColor='black'
+ fontWeight='normal'
+ dx=90
+ label='label text'
+ opacity=1
+ renderLabel=true
+ size=200
+ stroke='none'
+ strokeWidth=1.5
+ svg='assets/my-svg.svg'
+ type='square'
+ viewGenerator=(node) => <CustomComponent node={node} />
+ className='node'
+ onClickNode={onClickNode}
+ onRightClickNode={onRightClickNode}
+ onMouseOverNode={onMouseOverNode}
+ onMouseOutNode={onMouseOutNode} />
+
+
+
+
+
+
+ Instance Members
+
+
+
+
+
+ ▸
+ handleOnClickNode
+
+
+
+
+
+
+
+ Handle click on the node.
+
+
+ handleOnClickNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ undefined
:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ handleOnRightClickNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Node/helper
+
+
+
+
+
+
+ Some methods that help no the process of rendering a node.
+
+
+ Node/helper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Static Members
+
+
+
+
+
+ ▸
+ _convertTypeToD3Symbol(typeName)
+
+
+
+
+
+
+
+ Converts a string that specifies a symbol into a concrete instance
+of d3 symbol.
+https://github.com/d3/d3-shape/blob/master/README.md#symbol
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ typeName (string)
+ the string that specifies the symbol type (should be one of
+node.symbolType
+).
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object
:
+ concrete instance of d3 symbol (defaults to circle).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ buildSvgSymbol(size, symbolTypeDesc)
+
+
+
+
+
+
+
+ Build a d3 svg symbol based on passed symbol and symbol type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ size (number
+ = 80
)
+ the size of the symbol.
+
+
+
+
+
+
+
+ symbolTypeDesc (string
+ = 'circle'
)
+ the string containing the type of symbol that we want to build
+(should be one of
+node.symbolType
+).
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Object
:
+ concrete instance of d3 symbol.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link
+
+
+
+
+
+
+ Link component is responsible for encapsulating link render.
+
+
+ new Link()
+
+
+
+ Extends
+
+ React.Component
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Example
+
+
+ const onClickLink = function(source, target) {
+ window.alert(`Clicked link between ${source} and ${target}`);
+};
+
+const onRightClickLink = function(source, target) {
+ window.alert(`Right clicked link between ${source} and ${target}`);
+};
+
+const onMouseOverLink = function(source, target) {
+ window.alert(`Mouse over in link between ${source} and ${target}`);
+};
+
+const onMouseOutLink = function(source, target) {
+ window.alert(`Mouse out link between ${source} and ${target}`);
+};
+
+<Link
+ d="M1..."
+ source="idSourceNode"
+ target="idTargetNode"
+ markerId="marker-small"
+ strokeWidth=1.5
+ stroke="green"
+ className="link"
+ opacity=1
+ mouseCursor="pointer"
+ onClickLink={onClickLink}
+ onRightClickLink={onRightClickLink}
+ onMouseOverLink={onMouseOverLink}
+ onMouseOutLink={onMouseOutLink} />
+
+
+
+
+
+
+ Instance Members
+
+
+
+
+
+ ▸
+ handleOnClickLink
+
+
+
+
+
+
+
+ Handle link click event.
+
+
+ handleOnClickLink
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ undefined
:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ handleOnRightClickLink
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link/helper
+
+
+
+
+
+
+ A set of helper methods to manipulate/create links.
+
+
+ Link/helper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Static Members
+
+
+
+
+
+ ▸
+ straightLineRadius()
+
+
+
+
+
+
+
+
+ ▸
+ smoothCurveRadius(x1, y1, x2, y2)
+
+
+
+
+
+
+
+ Computes radius for a smooth curve effect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ x1 (number)
+ x value for point 1
+
+
+
+
+
+
+
+ y1 (number)
+ y value for point 1
+
+
+
+
+
+
+
+ x2 (number)
+ y value for point 2
+
+
+
+
+
+
+
+ y2 (number)
+ y value for point 2
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ number
:
+ value of radius.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ fullCurveRadius()
+
+
+
+
+
+
+
+
+ ▸
+ getRadiusStrategy(type)
+
+
+
+
+
+
+
+ Get a strategy to compute line radius.
+CURVE_SMOOTH type inspired by mbostock - Mobile Patent Suits.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ type (string
+ = LINE_TYPES.STRAIGHT
)
+ type of curve to get radius strategy from.
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ Function
:
+ a function that calculates a radius
+to match curve type expectation. Fallback is the straight line.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ▸
+ buildLinkPathDefinition(link, type)
+
+
+
+
+
+
+
+ This method returns the path definition for a given link base on the line type
+and the link source and target.
+d attribute mdn
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Parameters
+
+
+
+
+ link (Object)
+ the link to build the path definition
+
+
+
+
+
+
+
+
+
+
+ Name
+ Description
+
+
+
+
+
+ link.source Object
+
+ (default {}
)
+
+ link source
+
+
+
+
+
+
+ link.target Object
+
+ (default {}
)
+
+ link target
+
+
+
+
+
+
+
+
+
+
+
+
+ type (string
+ = LINE_TYPES.STRAIGHT
)
+ the link line type
+
+
+
+
+
+
+
+
+
+
+
+
+ Returns
+ string
:
+ the path definition for the requested link
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link/const
+
+
+
+
+
+
+ A set of constants that facilitate readability regarding links.
+
+
+ Link/const
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Static Members
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Marker
+
+
+
+
+
+
+ Market component provides configurable interface to marker definition.
+
+
+ new Marker()
+
+
+
+ Extends
+
+ React.Component
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Example
+
+
+ <Marker id="marker-id" fill="black" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Marker/helper
+
+
+
+
+
+
+ Offers a series of methods to compute proper markers within a given context.
+
+
+ Marker/helper
+
+
-
-
-
-
-
-
-
-
-
-
-
-
Some methods that help no the process of rendering a node.
-Converts a string that specifies a symbol into a concrete instance
-of d3 symbol.
-https://github.com/d3/d3-shape/blob/master/README.md#symbol
(string)
- the string that specifies the symbol type (should be one of
-node.symbolType
-).
-
- Object
:
- concrete instance of d3 symbol (defaults to circle).
+ This function is a key template builder to access MARKERS structure. +WARN: function tightly coupled to the MARKERS object in marker.const.
- - - - + - - - - -Build a d3 svg symbol based on passed symbol and symbol type.
- - - - - - - - - -(string
- = 'circle'
)
- the string containing the type of symbol that we want to build
-(should be one of
-node.symbolType
-).
+ highlighted (string)
+ string that indicates highlight state of marker.
Object
:
- concrete instance of d3 symbol.
-
-
-
-
-
-
-
-
-
+ string
:
+ the key of the marker.
-
- Link component is responsible for encapsulating link render.
-- Extends - - React.Component - -
- - - - - - - - - - - - -const onClickLink = function(source, target) {
- window.alert(`Clicked link between ${source} and ${target}`);
-};
-const onRightClickLink = function(source, target) {
- window.alert(`Right clicked link between ${source} and ${target}`);
-};
-const onMouseOverLink = function(source, target) {
- window.alert(`Mouse over in link between ${source} and ${target}`);
-};
-const onMouseOutLink = function(source, target) {
- window.alert(`Mouse out link between ${source} and ${target}`);
-};
-<Link
- d="M1..."
- source='idSourceNode'
- target='idTargetNode'
- markerId='marker-small'
- strokeWidth=1.5
- stroke='green'
- className='link'
- opacity=1
- mouseCursor='pointer'
- onClickLink={onClickLink}
- onRightClickLink={onRightClickLink}
- onMouseOverLink={onMouseOverLink}
- onMouseOutLink={onMouseOutLink} />
-
-
+Handle link click event.
-This functions returns the proper marker size given the inputs that describe the scenario +where the marker is to be applied.
- - - - - - - + - - - -undefined
:
-
-
-
-
-
-
-
-
-
-Handle link right click event.
+(number)
+ the delta zoom value to calculate resize transformations.
- Handle mouse out link event.
+This function holds logic to retrieve the appropriate marker id that reflects the input +parameters, markers can vary with highlight and transform value.
-undefined
:
-
-
-
-
-
-
-
-
-
-(boolean)
+ tells us whether or not some element (link or node) is highlighted.
-
-
-
- (number)
+ the delta zoom value to calculate resize transformations.
+
+ (Object)
+ the graph config object.
+
+ Name | +Description | +
---|---|
config.maxZoom any
+ |
+ + |
Computes radius for a smooth curve effect.
+This function memoize results for _computeMarkerId +since many of the times user will be playing around with the same zoom +factor, we can take advantage of this and cache the results for a +given combination of highlight state, zoom transform value and maxZoom config.
- - - - - - - - - +(number)
- x value for point 1
- (number)
- y value for point 1
- (number)
- y value for point 2
- (number)
- y value for point 2
- number
:
- value of radius.
-
-
-
-
-
-
-
-
-Get a strategy to compute line radius.
-CURVE_SMOOTH type inspired by mbostock - Mobile Patent Suits.
Memoized reference for _memoizedComputeMarkerId exposed +as getter for sake of readability. +Gets proper marker id given the highlight state and the zoom +transform.
- - - - - - - - - +(string
- = LINE_TYPES.STRAIGHT
)
- type of curve to get radius strategy from.
- Function
:
- a function that calculates a radius
-to match curve type expectation. Fallback is the straight line.
-
-
-
-
-
-
-
-
-(boolean)
+ tells us whether or not some element (link or node) is highlighted.
-
+ This method returns the path definition for a given link base on the line type -and the link source and target. -d attribute mdn
+(Object)
- the link to build the path definition
+ config (Object)
+ the graph config object.
link.source Object
-
- (default {} )
- |
- link source - | -||
link.target Object
-
- (default {} )
+ | config.maxZoom Object
|
- link target + | max zoom that can be performed against the graph. |
(string
- = LINE_TYPES.STRAIGHT
)
- the link line type
- string
:
- the path definition for the requested link
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- A set of constants that facilitate readability regarding links.
- - -Market component provides configurable interface to marker definition.
+Offers a series of generic methods for object manipulation, and other operations +that are common across rd3g such as error logging.
-- Extends - - React.Component - -
- - - - - - - +<Marker id="marker-id" fill="black" />
-
-
-
-
-
-Offers a series of methods to compute proper markers within a given context.
-This function is a key template builder to access MARKERS structure. -WARN: function tightly coupled to the MARKERS object in marker.const.
- - - - - - - - - - - - - - -(string)
- string that indicates size of marker.
-
- (string)
- string that indicates highlight state of marker.
-
- string
:
- the key of the marker.
+ Checks whether a certain object property is from object type and is a non empty object.
- - - - + - - - - -This functions returns the proper marker size given the inputs that describe the scenario -where the marker is to be applied.
- - - - - - - - - -(number)
- the delta zoom value to calculate resize transformations.
- string
:
- the size.
-
-
-
-
-
-
-
-
-
-
-
-
-
-This function holds logic to retrieve the appropriate marker id that reflects the input -parameters, markers can vary with highlight and transform value.
- - - - - - - - - - -(number)
- the delta zoom value to calculate resize transformations.
- (Object)
- the graph config object.
- Name | -Description | -
---|---|
config.maxZoom any
- |
- - |
string
:
- the id of the result marker.
-
-
-
-
-
-
-
-
This function memoize results for _computeMarkerId -since many of the times user will be playing around with the same zoom -factor, we can take advantage of this and cache the results for a -given combination of highlight state, zoom transform value and maxZoom config.
- - -Function
:
- memoize wrapper to the _computeMarkerId operation.
+ Generic deep comparison between javascript simple or complex objects.
- - - - + - - - - -Memoized reference for _memoizedComputeMarkerId exposed -as getter for sake of readability. -Gets proper marker id given the highlight state and the zoom -transform.
-boolean
:
+ returns true if o1 and o2 have exactly the same content, or are exactly the same object reference.
- Offers a series of generic methods for object manipulation, and other operations -that are common across rd3g such as error logging.
-Checks whether a certain object property is from object type and is a non empty object.
+ +Checks whether or not a certain object is empty. +NOTE: If the passed parameter is not an object the method return false.
+ + + + + + + + + + - - - - - - - - - -(Object)
- the object.
+ object whom emptiness we want to check.
(string)
- the object property.
- boolean
:
- returns true if o
-[
-k
-]
- is an non empty object.
+ true if the given object is n ft and object and is empty.
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
Generic deep comparison between javascript simple or complex objects.
+ +Function to deep clone plain javascript objects.
+ + + + + + + + + + - - - - - - - - - -(number
@@ -8124,107 +8549,38 @@
this parameter serves only for internal usage.
boolean
:
- returns true if o1 and o2 have exactly the same content, or are exactly the same object reference.
-
-
-
+ Object
:
+ the cloned object.
- Checks whether or not a certain object is empty. -NOTE: If the passed parameter is not an object the method return false.
- - - - - - - - - - -(Object)
- object whom emptiness we want to check.
- boolean
:
- true if the given object is n ft and object and is empty.
-
-
-
-
-
-
-
-
This function merges two objects o1 and o2, where o2 properties override existent o1 properties, and if o2 doesn't posses some o1 property the fallback will be the o1 property.
- - - - - - - - - + + + + + + + + +(Object
@@ -8263,9 +8619,9 @@
object.
(Object
@@ -8273,9 +8629,9 @@
object that will override o1 properties.
(int
@@ -8283,39 +8639,39 @@
the depth at which we are merging the object.
Object
:
object that is the result of merging o1 and o2, being o2 properties priority overriding
existent o1 properties.
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
Create new object from the inputted one only with the props passed in the props list.
- - - - - - - - - + + + + + + + + +(Object)
the object to pick props from.
Object
:
the object resultant from the picking operation.
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
Helper function for customized error logging.
- - - - - - - - - + + + + + + + + +(string)
the name of the component where the error is to be thrown.
(string)
the message contain a more detailed explanation about the error.
Error
:
the thrown error.
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
=0;)(r=a[o])&&(i&&i!==r.nextSibling&&i.parentNode.insertBefore(r,i),i=r);return this},sort:function(e){function t(t,n){return t&&n?e(t.__data__,n.__data__):!t-!n}e||(e=b);for(var n=this._groups,r=n.length,a=new Array(r),o=0;o e.r&&(e.r=e[t].r)}function l(){if(t){var r,a,o=t.length;for(n=new Array(o),r=0;r0)for(var n,r,a=new Array(n),o=0;o1?"items":"item";return f.default.createElement("span",{className:"rejt-collapsed"},f.default.createElement("span",{className:"rejt-collapsed-text",style:p,onClick:this.handleCollapseMode}," [...]"," ",m," ",g),v)}},{key:"renderNotCollapsed",value:function(){var e=this,t=this.state,n=t.name,r=t.data,a=t.keyPath,o=t.deep,i=t.addFormVisible,u=this.props,s=u.isCollapsed,l=u.handleRemove,c=u.onDeltaUpdate,d=u.readOnly,m=u.getStyle,v=u.dataType,y=u.addButtonElement,g=u.cancelButtonElement,_=u.editButtonElement,b=u.inputElementGenerator,E=u.textareaElementGenerator,x=u.minusMenuElement,w=u.plusMenuElement,k=u.beforeRemoveAction,P=u.beforeAddAction,S=u.beforeUpdateAction,O=u.logger,C=u.onSubmitValueParser,M=m(n,r,a,o,v),N=M.minus,T=M.plus,A=M.delimiter,R=M.ul,j=M.addForm,D=null,F=d(n,r,a,o,v);if(!F){var I=f.default.cloneElement(x,{onClick:l,className:"rejt-minus-menu",style:N});D=0!==o?I:null}var U=r.map(function(t,n){return f.default.createElement(h.default,{key:n,name:""+n,data:t,keyPath:a,deep:o,isCollapsed:s,handleRemove:e.handleRemoveItem(n),handleUpdateValue:e.handleEditValue,onUpdate:e.onChildUpdate,onDeltaUpdate:c,readOnly:d,getStyle:m,addButtonElement:y,cancelButtonElement:g,editButtonElement:_,inputElementGenerator:b,textareaElementGenerator:E,minusMenuElement:x,plusMenuElement:w,beforeRemoveAction:k,beforeAddAction:P,beforeUpdateAction:S,logger:O,onSubmitValueParser:C})}),L=null;if(!F){var z=f.default.cloneElement(w,{onClick:this.handleAddMode,className:"rejt-plus-menu",style:T});L=i?f.default.createElement("span",{className:"rejt-add-form",style:j},f.default.createElement(p.default,{handleAdd:this.handleAddValueAdd,handleCancel:this.handleAddValueCancel,onlyValue:!0,addButtonElement:y,cancelButtonElement:g,inputElementGenerator:b,keyPath:a,deep:o,onSubmitValueParser:C})):f.default.createElement("span",null,z," ",D)}return f.default.createElement("span",{className:"rejt-not-collapsed"},f.default.createElement("span",{className:"rejt-not-collapsed-delimiter",style:A},"["),f.default.createElement("ul",{className:"rejt-not-collapsed-list",style:R},U),f.default.createElement("span",{className:"rejt-not-collapsed-delimiter",style:A},"]"),L)}},{key:"render",value:function(){var e=this.state,t=e.name,n=e.collapsed,r=e.data,a=e.keyPath,o=e.deep,i=this.props,u=i.dataType,s=i.getStyle,l=n?this.renderCollapsed():this.renderNotCollapsed(),c=s(t,r,a,o,u);return f.default.createElement("div",{className:"rejt-array-node"},f.default.createElement("span",{onClick:this.handleCollapseMode},f.default.createElement("span",{className:"rejt-name",style:c.name},t," : ")),l)}}]),t}(c.Component);b.propTypes=g,b.defaultProps=_,t.default=b},function(e,t,n){n(94)("getOwnPropertyNames",function(){return n(158).f})},function(e,t,n){n(179);var r=n(3).Object;e.exports=function(e){return r.getOwnPropertyNames(e)}},function(e,t,n){e.exports={default:n(180),__esModule:!0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=g(n(181)),a=g(n(36)),o=g(n(31)),i=g(n(13)),u=g(n(12)),s=g(n(11)),l=g(n(10)),c=g(n(9)),f=n(1),d=g(f),h=g(n(2)),p=g(n(69)),m=g(n(106)),v=n(28),y=n(63);function g(e){return e&&e.__esModule?e:{default:e}}var _={data:h.default.object.isRequired,name:h.default.string.isRequired,isCollapsed:h.default.func.isRequired,keyPath:h.default.array,deep:h.default.number,handleRemove:h.default.func,onUpdate:h.default.func.isRequired,onDeltaUpdate:h.default.func.isRequired,readOnly:h.default.func.isRequired,dataType:h.default.string,getStyle:h.default.func.isRequired,addButtonElement:h.default.element,cancelButtonElement:h.default.element,editButtonElement:h.default.element,inputElementGenerator:h.default.func.isRequired,textareaElementGenerator:h.default.func.isRequired,minusMenuElement:h.default.element,plusMenuElement:h.default.element,beforeRemoveAction:h.default.func,beforeAddAction:h.default.func,beforeUpdateAction:h.default.func,logger:h.default.object.isRequired,onSubmitValueParser:h.default.func.isRequired},b={keyPath:[],deep:0,minusMenuElement:d.default.createElement("span",null," - "),plusMenuElement:d.default.createElement("span",null," + ")},E=function(e){function t(e){(0,u.default)(this,t);var n=(0,l.default)(this,(t.__proto__||(0,i.default)(t)).call(this,e)),r=e.deep+1,a=0===r?[]:[].concat((0,o.default)(e.keyPath),[e.name]);return n.state={name:e.name,data:e.data,keyPath:a,deep:r,collapsed:e.isCollapsed(a,r,e.data),addFormVisible:!1},n.handleCollapseMode=n.handleCollapseMode.bind(n),n.handleRemoveValue=n.handleRemoveValue.bind(n),n.handleAddMode=n.handleAddMode.bind(n),n.handleAddValueAdd=n.handleAddValueAdd.bind(n),n.handleAddValueCancel=n.handleAddValueCancel.bind(n),n.handleEditValue=n.handleEditValue.bind(n),n.onChildUpdate=n.onChildUpdate.bind(n),n.renderCollapsed=n.renderCollapsed.bind(n),n.renderNotCollapsed=n.renderNotCollapsed.bind(n),n}return(0,c.default)(t,e),(0,s.default)(t,[{key:"componentWillReceiveProps",value:function(e){this.setState({data:e.data})}},{key:"onChildUpdate",value:function(e,t){var n=this.state,r=n.data,a=n.keyPath;r[e]=t,this.setState({data:r}),(0,this.props.onUpdate)(a[a.length-1],r)}},{key:"handleAddMode",value:function(){this.setState({addFormVisible:!0})}},{key:"handleAddValueCancel",value:function(){this.setState({addFormVisible:!1})}},{key:"handleAddValueAdd",value:function(e){var t=this,n=e.key,r=e.newValue,a=this.state,o=a.data,i=a.keyPath,u=a.deep,s=this.props,l=s.beforeAddAction,c=s.logger;l(n,i,u,r).then(function(){o[n]=r,t.setState({data:o}),t.handleAddValueCancel();var e=t.props,a=e.onUpdate,s=e.onDeltaUpdate;a(i[i.length-1],o),s({type:y.ADD_DELTA_TYPE,keyPath:i,deep:u,key:n,newValue:r})}).catch(c.error)}},{key:"handleRemoveValue",value:function(e){var t=this;return function(){var n=t.props,r=n.beforeRemoveAction,a=n.logger,o=t.state,i=o.data,u=o.keyPath,s=o.deep,l=i[e];r(e,u,s,l).then(function(){var n=(0,v.getObjectType)(l),r={keyPath:u,deep:s,key:e,oldValue:l};"Object"===n||"Array"===n?(r.type=y.UPDATE_DELTA_TYPE,r.newValue=null,i[e]=null):(r.type=y.REMOVE_DELTA_TYPE,delete i[e]),t.setState({data:i});var a=t.props,o=a.onUpdate,c=a.onDeltaUpdate;o(u[u.length-1],i),c(r)}).catch(a.error)}}},{key:"handleCollapseMode",value:function(){this.setState({collapsed:!this.state.collapsed})}},{key:"handleEditValue",value:function(e){var t=this,n=e.key,r=e.value;return new a.default(function(e,a){var o=t.props.beforeUpdateAction,i=t.state,u=i.data,s=i.keyPath,l=i.deep,c=u[n];o(n,s,l,c,r).then(function(){u[n]=r,t.setState({data:u});var a=t.props,o=a.onUpdate,i=a.onDeltaUpdate;o(s[s.length-1],u),i({type:y.UPDATE_DELTA_TYPE,keyPath:s,deep:l,key:n,newValue:r,oldValue:c}),e()}).catch(a)})}},{key:"renderCollapsed",value:function(){var e=this.state,t=e.name,n=e.keyPath,a=e.deep,o=e.data,i=this.props,u=i.handleRemove,s=i.readOnly,l=i.dataType,c=i.getStyle,f=i.minusMenuElement,h=c(t,o,n,a,l),p=h.minus,m=h.collapsed,v=(0,r.default)(o).length,y=v>1?"keys":"key",g=null;if(!s(t,o,n,a,l)){var _=d.default.cloneElement(f,{onClick:u,className:"rejt-minus-menu",style:p});g=0!==a?_:null}return d.default.createElement("span",{className:"rejt-collapsed"},d.default.createElement("span",{className:"rejt-collapsed-text",style:m,onClick:this.handleCollapseMode}," {...}"," ",v," ",y),g)}},{key:"renderNotCollapsed",value:function(){var e=this,t=this.state,n=t.name,a=t.data,o=t.keyPath,i=t.deep,u=t.addFormVisible,s=this.props,l=s.isCollapsed,c=s.handleRemove,f=s.onDeltaUpdate,h=s.readOnly,v=s.getStyle,y=s.dataType,g=s.addButtonElement,_=s.cancelButtonElement,b=s.editButtonElement,E=s.inputElementGenerator,x=s.textareaElementGenerator,w=s.minusMenuElement,k=s.plusMenuElement,P=s.beforeRemoveAction,S=s.beforeAddAction,O=s.beforeUpdateAction,C=s.logger,M=s.onSubmitValueParser,N=v(n,a,o,i,y),T=N.minus,A=N.plus,R=N.addForm,j=N.ul,D=N.delimiter,F=(0,r.default)(a),I=null,U=h(n,a,o,i,y);if(!U){var L=d.default.cloneElement(w,{onClick:c,className:"rejt-minus-menu",style:T});I=0!==i?L:null}var z=F.map(function(t){return d.default.createElement(p.default,{key:t,name:t,data:a[t],keyPath:o,deep:i,isCollapsed:l,handleRemove:e.handleRemoveValue(t),handleUpdateValue:e.handleEditValue,onUpdate:e.onChildUpdate,onDeltaUpdate:f,readOnly:h,getStyle:v,addButtonElement:g,cancelButtonElement:_,editButtonElement:b,inputElementGenerator:E,textareaElementGenerator:x,minusMenuElement:w,plusMenuElement:k,beforeRemoveAction:P,beforeAddAction:S,beforeUpdateAction:O,logger:C,onSubmitValueParser:M})}),V=null;if(!U){var $=d.default.cloneElement(k,{onClick:this.handleAddMode,className:"rejt-plus-menu",style:A});V=u?d.default.createElement("span",{className:"rejt-add-form",style:R},d.default.createElement(m.default,{handleAdd:this.handleAddValueAdd,handleCancel:this.handleAddValueCancel,addButtonElement:g,cancelButtonElement:_,inputElementGenerator:E,keyPath:o,deep:i,onSubmitValueParser:M})):d.default.createElement("span",null,$," ",I)}return d.default.createElement("span",{className:"rejt-not-collapsed"},d.default.createElement("span",{className:"rejt-not-collapsed-delimiter",style:D},"{"),d.default.createElement("ul",{className:"rejt-not-collapsed-list",style:j},z),d.default.createElement("span",{className:"rejt-not-collapsed-delimiter",style:D},"}"),V)}},{key:"render",value:function(){var e=this.state,t=e.name,n=e.collapsed,r=e.data,a=e.keyPath,o=e.deep,i=this.props,u=i.getStyle,s=i.dataType,l=n?this.renderCollapsed():this.renderNotCollapsed(),c=u(t,r,a,o,s);return d.default.createElement("div",{className:"rejt-object-node"},d.default.createElement("span",{onClick:this.handleCollapseMode},d.default.createElement("span",{className:"rejt-name",style:c.name},t," : ")),l)}}]),t}(f.Component);E.propTypes=_,E.defaultProps=b,t.default=E},function(e,t,n){var r;!function(a,o,i){if(a){for(var u,s={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},l={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},c={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},f={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},d=1;d<20;++d)s[111+d]="f"+d;for(d=0;d<=9;++d)s[d+96]=d.toString();_.prototype.bind=function(e,t,n){return e=e instanceof Array?e:[e],this._bindMultiple.call(this,e,t,n),this},_.prototype.unbind=function(e,t){return this.bind.call(this,e,function(){},t)},_.prototype.trigger=function(e,t){return this._directMap[e+":"+t]&&this._directMap[e+":"+t]({},e),this},_.prototype.reset=function(){return this._callbacks={},this._directMap={},this},_.prototype.stopCallback=function(e,t){return!((" "+t.className+" ").indexOf(" mousetrap ")>-1)&&(!function e(t,n){return null!==t&&t!==o&&(t===n||e(t.parentNode,n))}(t,this.target)&&("INPUT"==t.tagName||"SELECT"==t.tagName||"TEXTAREA"==t.tagName||t.isContentEditable))},_.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)},_.addKeycodes=function(e){for(var t in e)e.hasOwnProperty(t)&&(s[t]=e[t]);u=null},_.init=function(){var e=_(o);for(var t in e)"_"!==t.charAt(0)&&(_[t]=function(t){return function(){return e[t].apply(e,arguments)}}(t))},_.init(),a.Mousetrap=_,void 0!==e&&e.exports&&(e.exports=_),void 0===(r=function(){return _}.call(t,n,t,e))||(e.exports=r)}function h(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent("on"+t,n)}function p(e){if("keypress"==e.type){var t=String.fromCharCode(e.which);return e.shiftKey||(t=t.toLowerCase()),t}return s[e.which]?s[e.which]:l[e.which]?l[e.which]:String.fromCharCode(e.which).toLowerCase()}function m(e,t){return e.sort().join(",")===t.sort().join(",")}function v(e){return"shift"==e||"ctrl"==e||"alt"==e||"meta"==e}function y(e,t,n){return n||(n=function(){if(!u)for(var e in u={},s)e>95&&e<112||s.hasOwnProperty(e)&&(u[s[e]]=e);return u}()[e]?"keydown":"keypress"),"keypress"==n&&t.length&&(n="keydown"),n}function g(e,t){var n,r,a,o=[];for(n=function(e){return"+"===e?["+"]:(e=e.replace(/\+{2}/g,"+plus")).split("+")}(e),a=0;a
\n * Here you can consult a detailed description of each graph configurable property as well as the default values\n * of those properties.\n *\n * **Note about performance**
\n * Some of the properties have a major performance impact when toggled while rendering graphs of medium or large dimensions (hundreds or thousand of elements).\n * These properties are marked with 🚅🚅🚅.
\n * ⭐ **tip** *to achieve smoother interactions you may want to provide a toggle to set **staticGraph** to **true** *
\n *
\n * **Note about granularity**
\n * Some of the properties listed in the {@link #config-node|Node section} are marked with 🔍🔍🔍. This means that this properties\n * have a higher level of granularity. These properties can be defined in the graph payload at a node level. (sample payload below)\n * ```javascript\n * const graph = {\n * nodes: [\n * {\n * id: "id",\n * color: "red", // only this node will be red\n * size: 300, // only this node will have size 300\n * symbolType: "diamond" // only this node will have "diamond" shape\n * }\n * ],\n * links: [...]\n * };\n * ```\n *\n *
\n *\n * - Graph global configurations\n * - d3 level configurations\n * - Node level configurations\n * - Link level configurations\n *\n *
\n *\n * # Graph global configurations
\n * @param {boolean} [automaticRearrangeAfterDropNode=false] - 🚅🚅🚅 when true performing a node drag and drop should automatically\n * rearrange all nodes positions based on new position of dragged node (note: **staticGraph** should be false).\n * @param {boolean} [collapsible=false] - 🚅🚅🚅 Allow leaf neighbors nodes to be collapsed (folded), this will allow users to clear the way out and focus on the parts of the graph that really matter.\n * To see an example of this behavior you can access this sandbox link that has a specific set up to experiment this feature. **NOTE**: At this moment\n * nodes without connections (orphan nodes) are not rendered when this property is activated (see [react-d3-graph/issues/#129](https://github.com/danielcaldas/react-d3-graph/issues/129)).\n *
\n * \n * @param {boolean} [directed=false] - This property makes react-d3-graph handle your graph as a directed graph. It will\n * out of the box provide the look and feel of a directed graph and add directional semantic to links. You can see a sample in the image below.\n *
\n * \n * @param {number} [focusZoom=1] - zoom that will be applied when the graph view is focused in a node. Its value must be between\n * *minZoom* and *maxZoom*. If the specified *focusZoom* is out of this range, *minZoom* or *maxZoom* will be applied instead.\n * **NOTE:** This animation is not trigger by default. In order to trigger it you need to pass down to `react-d3-graph` the\n * node that you want to focus via prop `focusedNodeId` along side with nodes and links:\n *\n * ```javascript\n * const data = {\n * nodes: this.state.data.nodes,\n * links: this.state.data.links,\n * focusedNodeId: "nodeIdToTriggerZoomAnimation"\n * };\n * ```\n *\n *
\n *\n * @param {number} [focusAnimationDuration=0.75] - duration (in seconds) for the animation that takes place when focusing the graph on a node.\n * @param {number} [height=400] - the height of the (svg) area where the graph will be rendered.\n * @param {boolean} [nodeHighlightBehavior=false] - 🚅🚅🚅 when user mouse hovers a node that node and adjacent common\n * connections will be highlighted (depending on the *highlightDegree* value). All the remaining nodes and links assume opacity value equal to **highlightOpacity**.\n * @param {boolean} [linkHighlightBehavior=false] - 🚅🚅🚅 when the user mouse hovers some link that link and the correspondent nodes will be highlighted, this is a similar behavior\n * to *nodeHighlightBehavior* but for links (just for historical reference this property was introduced in **v1.0.0**).\n * @param {number} [highlightDegree=1] - **Possible values: 0, 1 or 2**. This value represents the range of the\n * highlight behavior when some node is highlighted. If the value is set to **0** only the selected node will be\n * highlighted. If the value is set to **1** the selected node and his 1st degree connections will be highlighted. If\n * the value is set to **2** the selected node will be highlighted as well as the 1st and 2nd common degree connections.\n * @param {number} [highlightOpacity=1] - this value is used to highlight nodes in the network. The lower\n * the value the more the less highlighted nodes will be visible (related to *nodeHighlightBehavior*).\n * @param {number} [maxZoom=8] - max zoom that can be performed against the graph.\n * @param {number} [minZoom=0.1] - min zoom that can be performed against the graph.\n * @param {boolean} [panAndZoom=false] - 🚅🚅🚅 pan and zoom effect when performing zoom in the graph,\n * a similar functionality may be consulted {@link https://bl.ocks.org/mbostock/2a39a768b1d4bc00a09650edef75ad39|here}.\n * @param {boolean} [staticGraph=false] - when setting this value to true the graph will be completely static, thus\n * all forces and drag events upon nodes will produce not effect. Note that, if this value is true the nodes will be\n * rendered with the initial provided **x and y coordinates** (links positions will be automatically set\n * from the given nodes positions by rd3g), no coordinates will be calculated by rd3g or subjacent d3 modules.\n * @param {number} [width=800] - the width of the (svg) area where the graph will be rendered.\n *
\n * @param {Object} d3 d3 object is explained in next section. ⬇️\n * # d3 level configurations
\n * @param {number} [d3.alphaTarget=0.05] - [see d3-force simulation.alphaTarget](https://github.com/d3/d3-force#simulation_alphaTarget)\n * @param {number} [d3.gravity=-100] - this will define how close nodes are to each other ([see d3 reference for forces](https://github.com/d3/d3-force#forces)).\n * - If value is positive, nodes will attract each other.\n * - If value is negative, nodes will repel each other. Most of the times this is what we want, so nodes don"t overlap.\n * @param {number} [d3.linkLength=100] - the length of each link from the center of the nodes it joins.\n * @param {number} [d3.linkStrength=1] - [see d3-force link.strength](https://github.com/d3/d3-force#link_strength)\n *
\n * @param {Object} node node object is explained in next section. ⬇️\n * # Node level configurations
\n * @param {string} [node.color="#d3d3d3"] - 🔍🔍🔍 this is the color that will be applied to the node if no **color property**\n * is found inside the node itself (yes **you can pass a property "color" inside the node and that color will override the\n * this default one**).\n * @param {string} [node.fontColor="black"] - 🔍🔍🔍 fill color for node"s
\n * @param {string} [node.mouseCursor="pointer"] - {@link https://developer.mozilla.org/en/docs/Web/CSS/cursor?v=control|cursor}\n * property for when some node is mouse hovered.\n * @param {number} [node.opacity=1] 🔍🔍🔍 - by default all nodes will have this opacity value.\n * @param {boolean} [node.renderLabel=true] - when set to false no labels will appear along side nodes in the\n * graph.\n * @param {number} [node.size=200] - 🔍🔍🔍 defines the size of all nodes.\n * @param {string} [node.strokeColor="none"] - 🔍🔍🔍 this is the stroke color that will be applied to the node if no **strokeColor property** is found inside the node itself (yes **you can pass a property "strokeColor" inside the node and that stroke color will override this default one** ).\n * @param {number} [node.strokeWidth=1.5] 🔍🔍🔍 - the width of the all node strokes.\n * @param {string} [node.svg=""] - 🔍🔍🔍 render custom svg for nodes in alternative to **node.symbolType**. This svg can\n * be provided as a string to either a remote svg resource or for a local one.\n *
\n * \n * @param {string} [node.symbolType="circle"] - 🔍🔍🔍 the shape of the node.\n * Use the following values under a property **type** inside each node (nodes may have different types, same as colors):\n * - "circle"\n * - "cross"\n * - "diamond"\n * - "square"\n * - "star"\n * - "triangle"\n * - "wye"\n *\n * **[note]** react-d3-graph will map this values to [d3 symbols](https://github.com/d3/d3-shape#symbols)\n * @param {Function} [node.viewGenerator=null] - 🔍🔍🔍 function that receives a node and returns a JSX view.\n *
\n * @param {Object} link link object is explained in the next section. ⬇️\n * # Link level configurations
\n * @param {string} [link.color="#d3d3d3"] - 🔍🔍🔍 the color for links\n * (from version 1.3.0 this property can be configured at link level).\n * @param {string} [link.fontColor="black"] - 🔍🔍🔍 fill color for link\'s \n * @param {number} [link.highlightFontSize=8] - fontSize in highlighted state.\n * @param {string} [link.highlightFontWeight="normal"] - fontWeight in highlighted state.\n * @param {boolean} [link.labelProperty="label"] - the property that will be rendered as label within some link. Note that\n * this property needs to be passed along the link payload (along side with source and target).\n * @param {string} [link.mouseCursor="pointer"] - {@link https://developer.mozilla.org/en/docs/Web/CSS/cursor?v=control|cursor}\n * property for when link is mouse hovered.\n * @param {number} [link.opacity=1] 🔍🔍🔍 - the default opacity value for links.\n * @param {boolean} [link.renderLabel=false] - when set to true labels will appear along side links in the\n * graph. **Note**: this will only happen of course if proper label is passed within the link, check also `link.labelProperty`.\n *
\n * \n * @param {boolean} [link.semanticStrokeWidth=false] - when set to true all links will have\n * *"semantic width"*, this means that the width of the connections will be proportional to the value of each link.\n * This is how link strokeWidth will be calculated:\n * ```javascript\n * strokeWidth += (linkValue * strokeWidth) / 10;\n * ```\n * @param {number} [link.strokeWidth=1.5] 🔍🔍🔍 - strokeWidth for all links. By default the actual value is obtain by the\n * following expression:\n * ```javascript\n * link.strokeWidth * (1 / transform); // transform is a zoom delta Δ value\n * ```\n * @param {string} [link.type="STRAIGHT"] - the type of line to draw, available types at this point are:\n * - "STRAIGHT" (default) - a straight line.\n * - "CURVE_SMOOTH" - a slight curve between two nodes\n * - "CURVE_FULL" - a semicircumference trajectory unites source and target nodes.\n *
\n * \n *\n * @example\n * // A simple config that uses some properties\n * const myConfig = {\n * nodeHighlightBehavior: true,\n * node: {\n * color: "lightgreen",\n * size: 120,\n * highlightStrokeColor: "blue"\n * },\n * link: {\n * highlightColor: "lightblue"\n * }\n * };\n *\n * // Sorry for the long config description, here"s a potato 🥔.\n */\nexports.default = {\n automaticRearrangeAfterDropNode: false,\n collapsible: false,\n directed: false,\n focusAnimationDuration: 0.75,\n focusZoom: 1,\n height: 400,\n highlightDegree: 1,\n highlightOpacity: 1,\n linkHighlightBehavior: false,\n maxZoom: 8,\n minZoom: 0.1,\n nodeHighlightBehavior: false,\n panAndZoom: false,\n staticGraph: false,\n width: 800,\n d3: {\n alphaTarget: 0.05,\n gravity: -100,\n linkLength: 100,\n linkStrength: 1\n },\n node: {\n color: "#d3d3d3",\n fontColor: "black",\n fontSize: 8,\n fontWeight: "normal",\n highlightColor: "SAME",\n highlightFontSize: 8,\n highlightFontWeight: "normal",\n highlightStrokeColor: "SAME",\n highlightStrokeWidth: "SAME",\n labelProperty: "id",\n mouseCursor: "pointer",\n opacity: 1,\n renderLabel: true,\n size: 200,\n strokeColor: "none",\n strokeWidth: 1.5,\n svg: "",\n symbolType: "circle",\n viewGenerator: null\n },\n link: {\n color: "#d3d3d3",\n fontColor: "black",\n fontSize: 8,\n fontWeight: "normal",\n highlightColor: "#d3d3d3",\n highlightFontSize: 8,\n highlightFontWeight: "normal",\n labelProperty: "label",\n mouseCursor: "pointer",\n opacity: 1,\n renderLabel: false,\n semanticStrokeWidth: false,\n strokeWidth: 1.5,\n type: "STRAIGHT"\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vc3JjL2NvbXBvbmVudHMvZ3JhcGgvZ3JhcGguY29uZmlnLmpzP2IyMmIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+PGk+VGhpcyBpcyBjZXJ0YWlubHkgdGhlIG9ubHkgZXh0cmEgcGllY2Ugb2YgZG9jdW1lbnRhdGlvbiB0aGF0IHlvdSB3aWxsIGV2ZXIgbmVlZDwvaT48L2Rpdj5cbiAqIDxici8+PGJyLz5cbiAqIEhlcmUgeW91IGNhbiBjb25zdWx0IGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZWFjaCBncmFwaCBjb25maWd1cmFibGUgcHJvcGVydHkgYXMgd2VsbCBhcyB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAqIG9mIHRob3NlIHByb3BlcnRpZXMuXG4gKlxuICogKipOb3RlIGFib3V0IHBlcmZvcm1hbmNlKio8YnIvPlxuICogU29tZSBvZiB0aGUgcHJvcGVydGllcyBoYXZlIGEgbWFqb3IgcGVyZm9ybWFuY2UgaW1wYWN0IHdoZW4gdG9nZ2xlZCB3aGlsZSByZW5kZXJpbmcgZ3JhcGhzIG9mIG1lZGl1bSBvciBsYXJnZSBkaW1lbnNpb25zIChodW5kcmVkcyBvciB0aG91c2FuZCBvZiBlbGVtZW50cykuXG4gKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBtYXJrZWQgd2l0aCDwn5qF8J+ahfCfmoUuPGJyLz5cbiAqIOKtkCAqKnRpcCoqICp0byBhY2hpZXZlIHNtb290aGVyIGludGVyYWN0aW9ucyB5b3UgbWF5IHdhbnQgdG8gcHJvdmlkZSBhIHRvZ2dsZSB0byBzZXQgKipzdGF0aWNHcmFwaCoqIHRvICoqdHJ1ZSoqICo8YnIvPlxuICogPGJyLz5cbiAqICoqTm90ZSBhYm91dCBncmFudWxhcml0eSoqPGJyLz5cbiAqIFNvbWUgb2YgdGhlIHByb3BlcnRpZXMgbGlzdGVkIGluIHRoZSB7QGxpbmsgI2NvbmZpZy1ub2RlfE5vZGUgc2VjdGlvbn0gYXJlIG1hcmtlZCB3aXRoIPCflI3wn5SN8J+UjS4gVGhpcyBtZWFucyB0aGF0IHRoaXMgcHJvcGVydGllc1xuICogaGF2ZSBhIGhpZ2hlciBsZXZlbCBvZiBncmFudWxhcml0eS4gVGhlc2UgcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgZ3JhcGggcGF5bG9hZCBhdCBhIG5vZGUgbGV2ZWwuIChzYW1wbGUgcGF5bG9hZCBiZWxvdylcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGdyYXBoID0ge1xuICogICAgIG5vZGVzOiBbXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICAgIGlkOiBcImlkXCIsXG4gKiAgICAgICAgICAgICBjb2xvcjogXCJyZWRcIiwgICAgICAgICAvLyBvbmx5IHRoaXMgbm9kZSB3aWxsIGJlIHJlZFxuICogICAgICAgICAgICAgc2l6ZTogMzAwLCAgICAgICAgICAgIC8vIG9ubHkgdGhpcyBub2RlIHdpbGwgaGF2ZSBzaXplIDMwMFxuICogICAgICAgICAgICAgc3ltYm9sVHlwZTogXCJkaWFtb25kXCIgLy8gb25seSB0aGlzIG5vZGUgd2lsbCBoYXZlIFwiZGlhbW9uZFwiIHNoYXBlXG4gKiAgICAgICAgIH1cbiAqICAgICBdLFxuICogICAgIGxpbmtzOiBbLi4uXVxuICogfTtcbiAqIGBgYFxuICpcbiAqIDxici8+XG4gKlxuICogLSA8YSBocmVmPVwiI2NvbmZpZy1nbG9iYWxcIj5HcmFwaCBnbG9iYWwgY29uZmlndXJhdGlvbnM8L2E+XG4gKiAtIDxhIGhyZWY9XCIjY29uZmlnLWQzXCI+ZDMgbGV2ZWwgY29uZmlndXJhdGlvbnM8L2E+XG4gKiAtIDxhIGhyZWY9XCIjY29uZmlnLW5vZGVcIj5Ob2RlIGxldmVsIGNvbmZpZ3VyYXRpb25zPC9hPlxuICogLSA8YSBocmVmPVwiI2NvbmZpZy1saW5rXCI+TGluayBsZXZlbCBjb25maWd1cmF0aW9uczwvYT5cbiAqXG4gKiA8YnIvPlxuICpcbiAqIDxoMiBpZD1cImNvbmZpZy1nbG9iYWxcIj48YSBocmVmPVwiI2NvbmZpZy1nbG9iYWxcIj4jPC9hPiAgR3JhcGggZ2xvYmFsIGNvbmZpZ3VyYXRpb25zPC9oMj5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2F1dG9tYXRpY1JlYXJyYW5nZUFmdGVyRHJvcE5vZGU9ZmFsc2VdIC0g8J+ahfCfmoXwn5qFIHdoZW4gdHJ1ZSBwZXJmb3JtaW5nIGEgbm9kZSBkcmFnIGFuZCBkcm9wIHNob3VsZCBhdXRvbWF0aWNhbGx5XG4gKiByZWFycmFuZ2UgYWxsIG5vZGVzIHBvc2l0aW9ucyBiYXNlZCBvbiBuZXcgcG9zaXRpb24gb2YgZHJhZ2dlZCBub2RlIChub3RlOiAqKnN0YXRpY0dyYXBoKiogc2hvdWxkIGJlIGZhbHNlKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbGxhcHNpYmxlPWZhbHNlXSAtIPCfmoXwn5qF8J+ahSBBbGxvdyBsZWFmIG5laWdoYm9ycyBub2RlcyB0byBiZSBjb2xsYXBzZWQgKGZvbGRlZCksIHRoaXMgd2lsbCBhbGxvdyB1c2VycyB0byBjbGVhciB0aGUgd2F5IG91dCBhbmQgZm9jdXMgb24gdGhlIHBhcnRzIG9mIHRoZSBncmFwaCB0aGF0IHJlYWxseSBtYXR0ZXIuXG4gKiBUbyBzZWUgYW4gZXhhbXBsZSBvZiB0aGlzIGJlaGF2aW9yIHlvdSBjYW4gYWNjZXNzIHRoaXMgc2FuZGJveCBsaW5rIHRoYXQgaGFzIGEgc3BlY2lmaWMgc2V0IHVwIHRvIGV4cGVyaW1lbnQgdGhpcyBmZWF0dXJlLiAqKk5PVEUqKjogQXQgdGhpcyBtb21lbnRcbiAqIG5vZGVzIHdpdGhvdXQgY29ubmVjdGlvbnMgKG9ycGhhbiBub2RlcykgYXJlIG5vdCByZW5kZXJlZCB3aGVuIHRoaXMgcHJvcGVydHkgaXMgYWN0aXZhdGVkIChzZWUgW3JlYWN0LWQzLWdyYXBoL2lzc3Vlcy8jMTI5XShodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsY2FsZGFzL3JlYWN0LWQzLWdyYXBoL2lzc3Vlcy8xMjkpKS5cbiAqIDxici8+XG4gKiA8aW1nIHNyYz1cImh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxjYWxkYXMvcmVhY3QtZDMtZ3JhcGgvYmxvYi9tYXN0ZXIvZG9jcy9yZDNnLWNvbGxhcHNpYmxlLmdpZj9yYXc9dHJ1ZVwiIHdpZHRoPVwiODIwXCIgaGVpZ2h0PVwiNDgwXCIvPlxuICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0ZWQ9ZmFsc2VdIC0gVGhpcyBwcm9wZXJ0eSBtYWtlcyByZWFjdC1kMy1ncmFwaCBoYW5kbGUgeW91ciBncmFwaCBhcyBhIGRpcmVjdGVkIGdyYXBoLiBJdCB3aWxsXG4gKiBvdXQgb2YgdGhlIGJveCBwcm92aWRlIHRoZSBsb29rIGFuZCBmZWVsIG9mIGEgZGlyZWN0ZWQgZ3JhcGggYW5kIGFkZCBkaXJlY3Rpb25hbCBzZW1hbnRpYyB0byBsaW5rcy4gWW91IGNhbiBzZWUgYSBzYW1wbGUgaW4gdGhlIGltYWdlIGJlbG93LlxuICogPGJyLz5cbiAqIDxpbWcgc3JjPVwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGNhbGRhcy9yZWFjdC1kMy1ncmFwaC9ibG9iL21hc3Rlci9kb2NzL3JkM2ctZGlyZWN0ZWQuZ2lmP3Jhdz10cnVlXCIgd2lkdGg9XCI4MjBcIiBoZWlnaHQ9XCI0ODBcIi8+XG4gKiBAcGFyYW0ge251bWJlcn0gW2ZvY3VzWm9vbT0xXSAtIHpvb20gdGhhdCB3aWxsIGJlIGFwcGxpZWQgd2hlbiB0aGUgZ3JhcGggdmlldyBpcyBmb2N1c2VkIGluIGEgbm9kZS4gSXRzIHZhbHVlIG11c3QgYmUgYmV0d2VlblxuICogKm1pblpvb20qIGFuZCAqbWF4Wm9vbSouIElmIHRoZSBzcGVjaWZpZWQgKmZvY3VzWm9vbSogaXMgb3V0IG9mIHRoaXMgcmFuZ2UsICptaW5ab29tKiBvciAqbWF4Wm9vbSogd2lsbCBiZSBhcHBsaWVkIGluc3RlYWQuXG4gKiAqKk5PVEU6KiogVGhpcyBhbmltYXRpb24gaXMgbm90IHRyaWdnZXIgYnkgZGVmYXVsdC4gSW4gb3JkZXIgdG8gdHJpZ2dlciBpdCB5b3UgbmVlZCB0byBwYXNzIGRvd24gdG8gYHJlYWN0LWQzLWdyYXBoYCB0aGVcbiAqIG5vZGUgdGhhdCB5b3Ugd2FudCB0byBmb2N1cyB2aWEgcHJvcCBgZm9jdXNlZE5vZGVJZGAgYWxvbmcgc2lkZSB3aXRoIG5vZGVzIGFuZCBsaW5rczpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBkYXRhID0ge1xuICogICAgbm9kZXM6IHRoaXMuc3RhdGUuZGF0YS5ub2RlcyxcbiAqICAgIGxpbmtzOiB0aGlzLnN0YXRlLmRhdGEubGlua3MsXG4gKiAgICBmb2N1c2VkTm9kZUlkOiBcIm5vZGVJZFRvVHJpZ2dlclpvb21BbmltYXRpb25cIlxuICogfTtcbiAqIGBgYFxuICpcbiAqIDxpbWcgc3JjPVwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGNhbGRhcy9yZWFjdC1kMy1ncmFwaC9ibG9iL21hc3Rlci9kb2NzL3JkM2ctem9vbS1hbmltYXRpb24uZ2lmP3Jhdz10cnVlXCIgd2lkdGg9XCI4MjBcIiBoZWlnaHQ9XCI0ODBcIi8+XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtmb2N1c0FuaW1hdGlvbkR1cmF0aW9uPTAuNzVdIC0gZHVyYXRpb24gKGluIHNlY29uZHMpIGZvciB0aGUgYW5pbWF0aW9uIHRoYXQgdGFrZXMgcGxhY2Ugd2hlbiBmb2N1c2luZyB0aGUgZ3JhcGggb24gYSBub2RlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9NDAwXSAtIHRoZSBoZWlnaHQgb2YgdGhlIChzdmcpIGFyZWEgd2hlcmUgdGhlIGdyYXBoIHdpbGwgYmUgcmVuZGVyZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtub2RlSGlnaGxpZ2h0QmVoYXZpb3I9ZmFsc2VdIC0g8J+ahfCfmoXwn5qFIHdoZW4gdXNlciBtb3VzZSBob3ZlcnMgYSBub2RlIHRoYXQgbm9kZSBhbmQgYWRqYWNlbnQgY29tbW9uXG4gKiBjb25uZWN0aW9ucyB3aWxsIGJlIGhpZ2hsaWdodGVkIChkZXBlbmRpbmcgb24gdGhlICpoaWdobGlnaHREZWdyZWUqIHZhbHVlKS4gQWxsIHRoZSByZW1haW5pbmcgbm9kZXMgYW5kIGxpbmtzIGFzc3VtZSBvcGFjaXR5IHZhbHVlIGVxdWFsIHRvICoqaGlnaGxpZ2h0T3BhY2l0eSoqLlxuICogQHBhcmFtIHtib29sZWFufSBbbGlua0hpZ2hsaWdodEJlaGF2aW9yPWZhbHNlXSAtIPCfmoXwn5qF8J+ahSB3aGVuIHRoZSB1c2VyIG1vdXNlIGhvdmVycyBzb21lIGxpbmsgdGhhdCBsaW5rIGFuZCB0aGUgY29ycmVzcG9uZGVudCBub2RlcyB3aWxsIGJlIGhpZ2hsaWdodGVkLCB0aGlzIGlzIGEgc2ltaWxhciBiZWhhdmlvclxuICogdG8gKm5vZGVIaWdobGlnaHRCZWhhdmlvciogYnV0IGZvciBsaW5rcyA8c21hbGw+KGp1c3QgZm9yIGhpc3RvcmljYWwgcmVmZXJlbmNlIHRoaXMgcHJvcGVydHkgd2FzIGludHJvZHVjZWQgaW4gKip2MS4wLjAqKik8L3NtYWxsPi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaGlnaGxpZ2h0RGVncmVlPTFdIC0gKipQb3NzaWJsZSB2YWx1ZXM6IDAsIDEgb3IgMioqLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIHRoZVxuICogaGlnaGxpZ2h0IGJlaGF2aW9yIHdoZW4gc29tZSBub2RlIGlzIGhpZ2hsaWdodGVkLiBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvICoqMCoqIG9ubHkgdGhlIHNlbGVjdGVkIG5vZGUgd2lsbCBiZVxuICogaGlnaGxpZ2h0ZWQuIElmIHRoZSB2YWx1ZSBpcyBzZXQgdG8gKioxKiogdGhlIHNlbGVjdGVkIG5vZGUgYW5kIGhpcyAxc3QgZGVncmVlIGNvbm5lY3Rpb25zIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuIElmXG4gKiB0aGUgdmFsdWUgaXMgc2V0IHRvICoqMioqIHRoZSBzZWxlY3RlZCBub2RlIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgYXMgd2VsbCBhcyB0aGUgMXN0IGFuZCAybmQgY29tbW9uIGRlZ3JlZSBjb25uZWN0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaGlnaGxpZ2h0T3BhY2l0eT0xXSAtIHRoaXMgdmFsdWUgaXMgdXNlZCB0byBoaWdobGlnaHQgbm9kZXMgaW4gdGhlIG5ldHdvcmsuIFRoZSBsb3dlclxuICogdGhlIHZhbHVlIHRoZSBtb3JlIHRoZSBsZXNzIGhpZ2hsaWdodGVkIG5vZGVzIHdpbGwgYmUgdmlzaWJsZSAocmVsYXRlZCB0byAqbm9kZUhpZ2hsaWdodEJlaGF2aW9yKikuXG4gKiBAcGFyYW0ge251bWJlcn0gW21heFpvb209OF0gLSBtYXggem9vbSB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgZ3JhcGguXG4gKiBAcGFyYW0ge251bWJlcn0gW21pblpvb209MC4xXSAtIG1pbiB6b29tIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSBncmFwaC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhbkFuZFpvb209ZmFsc2VdIC0g8J+ahfCfmoXwn5qFIHBhbiBhbmQgem9vbSBlZmZlY3Qgd2hlbiBwZXJmb3JtaW5nIHpvb20gaW4gdGhlIGdyYXBoLFxuICogYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIGNvbnN1bHRlZCB7QGxpbmsgaHR0cHM6Ly9ibC5vY2tzLm9yZy9tYm9zdG9jay8yYTM5YTc2OGIxZDRiYzAwYTA5NjUwZWRlZjc1YWQzOXxoZXJlfS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0YXRpY0dyYXBoPWZhbHNlXSAtIHdoZW4gc2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgdGhlIGdyYXBoIHdpbGwgYmUgY29tcGxldGVseSBzdGF0aWMsIHRodXNcbiAqIGFsbCBmb3JjZXMgYW5kIGRyYWcgZXZlbnRzIHVwb24gbm9kZXMgd2lsbCBwcm9kdWNlIG5vdCBlZmZlY3QuIE5vdGUgdGhhdCwgaWYgdGhpcyB2YWx1ZSBpcyB0cnVlIHRoZSBub2RlcyB3aWxsIGJlXG4gKiByZW5kZXJlZCB3aXRoIHRoZSBpbml0aWFsIHByb3ZpZGVkICoqeCBhbmQgeSBjb29yZGluYXRlcyoqIChsaW5rcyBwb3NpdGlvbnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldFxuICogZnJvbSB0aGUgZ2l2ZW4gbm9kZXMgcG9zaXRpb25zIGJ5IHJkM2cpLCBubyBjb29yZGluYXRlcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgcmQzZyBvciBzdWJqYWNlbnQgZDMgbW9kdWxlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9ODAwXSAtIHRoZSB3aWR0aCBvZiB0aGUgKHN2ZykgYXJlYSB3aGVyZSB0aGUgZ3JhcGggd2lsbCBiZSByZW5kZXJlZC5cbiAqIDxici8+XG4gKiBAcGFyYW0ge09iamVjdH0gZDMgZDMgb2JqZWN0IGlzIGV4cGxhaW5lZCBpbiBuZXh0IHNlY3Rpb24uIOKsh++4j1xuICogPGgyIGlkPVwiY29uZmlnLWQzXCI+PGEgaHJlZj1cIiNjb25maWctZDNcIj4jPC9hPiBkMyBsZXZlbCBjb25maWd1cmF0aW9uczwvaDI+XG4gKiBAcGFyYW0ge251bWJlcn0gW2QzLmFscGhhVGFyZ2V0PTAuMDVdIC0gW3NlZSBkMy1mb3JjZSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0XShodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZm9yY2Ujc2ltdWxhdGlvbl9hbHBoYVRhcmdldClcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZDMuZ3Jhdml0eT0tMTAwXSAtIHRoaXMgd2lsbCBkZWZpbmUgaG93IGNsb3NlIG5vZGVzIGFyZSB0byBlYWNoIG90aGVyIChbc2VlIGQzIHJlZmVyZW5jZSBmb3IgZm9yY2VzXShodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZm9yY2UjZm9yY2VzKSkuXG4gKiAgLSBJZiB2YWx1ZSBpcyBwb3NpdGl2ZSwgbm9kZXMgd2lsbCBhdHRyYWN0IGVhY2ggb3RoZXIuXG4gKiAgLSBJZiB2YWx1ZSBpcyBuZWdhdGl2ZSwgbm9kZXMgd2lsbCByZXBlbCBlYWNoIG90aGVyLiBNb3N0IG9mIHRoZSB0aW1lcyB0aGlzIGlzIHdoYXQgd2Ugd2FudCwgc28gbm9kZXMgZG9uXCJ0IG92ZXJsYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gW2QzLmxpbmtMZW5ndGg9MTAwXSAtIHRoZSBsZW5ndGggb2YgZWFjaCBsaW5rIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgbm9kZXMgaXQgam9pbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2QzLmxpbmtTdHJlbmd0aD0xXSAtIFtzZWUgZDMtZm9yY2UgbGluay5zdHJlbmd0aF0oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWZvcmNlI2xpbmtfc3RyZW5ndGgpXG4gKiA8YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgbm9kZSBvYmplY3QgaXMgZXhwbGFpbmVkIGluIG5leHQgc2VjdGlvbi4g4qyH77iPXG4gKiA8aDIgaWQ9XCJjb25maWctbm9kZVwiPjxhIGhyZWY9XCIjY29uZmlnLW5vZGVcIj4jPC9hPiBOb2RlIGxldmVsIGNvbmZpZ3VyYXRpb25zPC9oMj5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbm9kZS5jb2xvcj1cIiNkM2QzZDNcIl0gLSDwn5SN8J+UjfCflI0gdGhpcyBpcyB0aGUgY29sb3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIG5vZGUgaWYgbm8gKipjb2xvciBwcm9wZXJ0eSoqXG4gKiBpcyBmb3VuZCBpbnNpZGUgdGhlIG5vZGUgaXRzZWxmICh5ZXMgKip5b3UgY2FuIHBhc3MgYSBwcm9wZXJ0eSBcImNvbG9yXCIgaW5zaWRlIHRoZSBub2RlIGFuZCB0aGF0IGNvbG9yIHdpbGwgb3ZlcnJpZGUgdGhlXG4gKiB0aGlzIGRlZmF1bHQgb25lKiopLlxuICogQHBhcmFtIHtzdHJpbmd9IFtub2RlLmZvbnRDb2xvcj1cImJsYWNrXCJdIC0g8J+UjfCflI3wn5SNIGZpbGwgY29sb3IgZm9yIG5vZGVcInMgPHRleHQ+IHN2ZyBsYWJlbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbm9kZS5mb250U2l6ZT04XSAtIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC1zaXplP3Y9Y29udHJvbHxmb250LXNpemV9XG4gKiBwcm9wZXJ0eSBmb3IgYWxsIG5vZGVzXCIgbGFiZWxzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtub2RlLmZvbnRXZWlnaHQ9XCJub3JtYWxcIl0gLSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQ1NTL2ZvbnQtd2VpZ2h0P3Y9Y29udHJvbHxmb250LXdlaWdodH1cbiAqIHByb3BlcnR5IGZvciBhbGwgbm9kZXNcIiBsYWJlbHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25vZGUuaGlnaGxpZ2h0Q29sb3I9XCJTQU1FXCJdIC0gY29sb3IgZm9yIGFsbCBoaWdobGlnaHRlZCBub2RlcyAodXNlIHN0cmluZyBcIlNBTUVcIiBpZiB5b3VcbiAqIHdhbnQgdGhlIG5vZGUgdG8ga2VlcCBpdHMgY29sb3IgaW4gaGlnaGxpZ2h0ZWQgc3RhdGUpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtub2RlLmhpZ2hsaWdodEZvbnRTaXplPThdIC0gZm9udFNpemUgaW4gaGlnaGxpZ2h0ZWQgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25vZGUuaGlnaGxpZ2h0Rm9udFdlaWdodD1cIm5vcm1hbFwiXSAtIGZvbnRXZWlnaHQgaW4gaGlnaGxpZ2h0ZWQgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25vZGUuaGlnaGxpZ2h0U3Ryb2tlQ29sb3I9XCJTQU1FXCJdIC0gc3Ryb2tlQ29sb3IgaW4gaGlnaGxpZ2h0ZWQgc3RhdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW25vZGUuaGlnaGxpZ2h0U3Ryb2tlV2lkdGg9XCJTQU1FXCJdIC0gc3Ryb2tlV2lkdGggaW4gaGlnaGxpZ2h0ZWQgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gW25vZGUubGFiZWxQcm9wZXJ0eT1cImlkXCJdIC0gdGhpcyBpcyB0aGUgbm9kZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgdXNlZCBpbiBydW50aW1lIHRvXG4gKiBmZXRjaCB0aGUgbGFiZWwgY29udGVudC4gWW91IGp1c3QgbmVlZCB0byBhZGQgc29tZSBwcm9wZXJ0eSAoZS5nLiBmaXJzdE5hbWUpIHRvIHRoZSBub2RlIHBheWxvYWQgYW5kIHRoZW4gc2V0XG4gKiBub2RlLmxhYmVsUHJvcGVydHkgdG8gYmUgKipcImZpcnN0TmFtZVwiKiouICoqVGhpcyBjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uISoqLCBpZiB5b3UgcGFzcyBhIGZ1bmN0aW9uIGhlcmUgaXQgd2lsbCBiZSBjYWxsZWRcbiAqIHRvIG9idGFpbiB0aGUgYGxhYmVsYCB2YWx1ZSBvbiB0aGUgZmx5LCBhcyBhIGNsaWVudCB5b3Ugd2lsbCByZWNlaXZlIGFsbCB0aGUgbm9kZSBpbmZvcm1hdGlvbiB0aGF0IHlvdSBwYXNzZWQgZG93biBpbnRvIHJlYWN0LWQzLWdyYXBoLFxuICogc28gdGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gd291bGQgYmU6XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbiBteUN1c3RvbUxhYmVsQnVpbGRlcihub2RlKSB7XG4gKiAgICAgLy8gZG8gc3R1ZmYgdG8gZ2V0IHRoZSBmaW5hbCByZXN1bHQuLi5cbiAqICAgICByZXR1cm4gXCJsYWJlbCBzdHJpbmdcIjtcbiAqIH1cbiAqIGBgYFxuICogVGhlbiB5b3UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBwYXNzIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGNvbmZpZyBpbiBgY29uZmlnLm5vZGUubGFiZWxQcm9wZXJ0eWAuXG4gKiA8YnIvPlxuICogQHBhcmFtIHtzdHJpbmd9IFtub2RlLm1vdXNlQ3Vyc29yPVwicG9pbnRlclwiXSAtIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9DU1MvY3Vyc29yP3Y9Y29udHJvbHxjdXJzb3J9XG4gKiBwcm9wZXJ0eSBmb3Igd2hlbiBzb21lIG5vZGUgaXMgbW91c2UgaG92ZXJlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbm9kZS5vcGFjaXR5PTFdIPCflI3wn5SN8J+UjSAtIGJ5IGRlZmF1bHQgYWxsIG5vZGVzIHdpbGwgaGF2ZSB0aGlzIG9wYWNpdHkgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtub2RlLnJlbmRlckxhYmVsPXRydWVdIC0gd2hlbiBzZXQgdG8gZmFsc2Ugbm8gbGFiZWxzIHdpbGwgYXBwZWFyIGFsb25nIHNpZGUgbm9kZXMgaW4gdGhlXG4gKiBncmFwaC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbm9kZS5zaXplPTIwMF0gLSDwn5SN8J+UjfCflI0gZGVmaW5lcyB0aGUgc2l6ZSBvZiBhbGwgbm9kZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25vZGUuc3Ryb2tlQ29sb3I9XCJub25lXCJdIC0g8J+UjfCflI3wn5SNICB0aGlzIGlzIHRoZSBzdHJva2UgY29sb3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIG5vZGUgaWYgbm8gKipzdHJva2VDb2xvciBwcm9wZXJ0eSoqIGlzIGZvdW5kIGluc2lkZSB0aGUgbm9kZSBpdHNlbGYgKHllcyAqKnlvdSBjYW4gcGFzcyBhIHByb3BlcnR5IFwic3Ryb2tlQ29sb3JcIiBpbnNpZGUgdGhlIG5vZGUgYW5kIHRoYXQgc3Ryb2tlIGNvbG9yIHdpbGwgb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IG9uZSoqICkuXG4gKiBAcGFyYW0ge251bWJlcn0gW25vZGUuc3Ryb2tlV2lkdGg9MS41XSDwn5SN8J+UjfCflI0gLSB0aGUgd2lkdGggb2YgdGhlIGFsbCBub2RlIHN0cm9rZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25vZGUuc3ZnPVwiXCJdIC0g8J+UjfCflI3wn5SNIHJlbmRlciBjdXN0b20gc3ZnIGZvciBub2RlcyBpbiBhbHRlcm5hdGl2ZSB0byAqKm5vZGUuc3ltYm9sVHlwZSoqLiBUaGlzIHN2ZyBjYW5cbiAqIGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nIHRvIGVpdGhlciBhIHJlbW90ZSBzdmcgcmVzb3VyY2Ugb3IgZm9yIGEgbG9jYWwgb25lLlxuICogPGJyLz5cbiAqIDxpbWcgc3JjPVwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGNhbGRhcy9yZWFjdC1kMy1ncmFwaC9ibG9iL21hc3Rlci9kb2NzL3JkM2ctY3VzdG9tLXN2Zy5naWY/cmF3PXRydWVcIiB3aWR0aD1cIjgyMFwiIGhlaWdodD1cIjQ4MFwiLz5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbm9kZS5zeW1ib2xUeXBlPVwiY2lyY2xlXCJdIC0g8J+UjfCflI3wn5SNIHRoZSA8c3BhbiBpZD1cIm5vZGUtc3ltYm9sLXR5cGVcIj5zaGFwZTwvc3Bhbj4gb2YgdGhlIG5vZGUuXG4gKiBVc2UgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdW5kZXIgYSBwcm9wZXJ0eSAqKnR5cGUqKiBpbnNpZGUgZWFjaCBub2RlIChub2RlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZXMsIHNhbWUgYXMgY29sb3JzKTpcbiAqICAgLSBcImNpcmNsZVwiXG4gKiAgIC0gXCJjcm9zc1wiXG4gKiAgIC0gXCJkaWFtb25kXCJcbiAqICAgLSBcInNxdWFyZVwiXG4gKiAgIC0gXCJzdGFyXCJcbiAqICAgLSBcInRyaWFuZ2xlXCJcbiAqICAgLSBcInd5ZVwiXG4gKlxuICogKipbbm90ZV0qKiByZWFjdC1kMy1ncmFwaCB3aWxsIG1hcCB0aGlzIHZhbHVlcyB0byBbZDMgc3ltYm9sc10oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNoYXBlI3N5bWJvbHMpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbm9kZS52aWV3R2VuZXJhdG9yPW51bGxdIC0g8J+UjfCflI3wn5SNIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBub2RlIGFuZCByZXR1cm5zIGEgSlNYIHZpZXcuXG4gKiA8YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IGxpbmsgbGluayBvYmplY3QgaXMgZXhwbGFpbmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIOKsh++4j1xuICogPGgyIGlkPVwiY29uZmlnLWxpbmtcIj48YSBocmVmPVwiI2NvbmZpZy1saW5rXCI+IzwvYT4gTGluayBsZXZlbCBjb25maWd1cmF0aW9uczwvaDI+XG4gKiBAcGFyYW0ge3N0cmluZ30gW2xpbmsuY29sb3I9XCIjZDNkM2QzXCJdIC0g8J+UjfCflI3wn5SNIHRoZSBjb2xvciBmb3IgbGlua3NcbiAqIChmcm9tIHZlcnNpb24gMS4zLjAgdGhpcyBwcm9wZXJ0eSBjYW4gYmUgY29uZmlndXJlZCBhdCBsaW5rIGxldmVsKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGluay5mb250Q29sb3I9XCJibGFja1wiXSAtIPCflI3wn5SN8J+UjSBmaWxsIGNvbG9yIGZvciBsaW5rJ3MgPHRleHQ+IHN2ZyBsYWJlbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGluay5mb250U2l6ZT04XSAtIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC1zaXplP3Y9Y29udHJvbHxmb250LXNpemV9XG4gKiBwcm9wZXJ0eSBmb3IgYWxsIGxpbmtzJyBsYWJlbHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xpbmsuZm9udFdlaWdodD1cIm5vcm1hbFwiXSAtIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9DU1MvZm9udC13ZWlnaHQ/dj1jb250cm9sfGZvbnQtd2VpZ2h0fVxuICogcHJvcGVydHkgZm9yIGFsbCBsaW5rcycgbGFiZWxzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtsaW5rLmhpZ2hsaWdodENvbG9yPVwiI2QzZDNkM1wiXSAtIGxpbmtzJyBjb2xvciBpbiBoaWdobGlnaHQgc3RhdGUuXG4gKiA8aW1nIHNyYz1cImh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxjYWxkYXMvcmVhY3QtZDMtZ3JhcGgvYmxvYi9tYXN0ZXIvZG9jcy9yZDNnLWJlbmQuZ2lmP3Jhdz10cnVlXCIgd2lkdGg9XCI4MjBcIiBoZWlnaHQ9XCI0ODBcIi8+XG4gKiBAcGFyYW0ge251bWJlcn0gW2xpbmsuaGlnaGxpZ2h0Rm9udFNpemU9OF0gLSBmb250U2l6ZSBpbiBoaWdobGlnaHRlZCBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGluay5oaWdobGlnaHRGb250V2VpZ2h0PVwibm9ybWFsXCJdIC0gZm9udFdlaWdodCBpbiBoaWdobGlnaHRlZCBzdGF0ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xpbmsubGFiZWxQcm9wZXJ0eT1cImxhYmVsXCJdIC0gdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBhcyBsYWJlbCB3aXRoaW4gc29tZSBsaW5rLiBOb3RlIHRoYXRcbiAqIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgcGFzc2VkIGFsb25nIHRoZSBsaW5rIHBheWxvYWQgKGFsb25nIHNpZGUgd2l0aCBzb3VyY2UgYW5kIHRhcmdldCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xpbmsubW91c2VDdXJzb3I9XCJwb2ludGVyXCJdIC0ge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0NTUy9jdXJzb3I/dj1jb250cm9sfGN1cnNvcn1cbiAqIHByb3BlcnR5IGZvciB3aGVuIGxpbmsgaXMgbW91c2UgaG92ZXJlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGluay5vcGFjaXR5PTFdIPCflI3wn5SN8J+UjSAtIHRoZSBkZWZhdWx0IG9wYWNpdHkgdmFsdWUgZm9yIGxpbmtzLlxuICogQHBhcmFtIHtib29sZWFufSBbbGluay5yZW5kZXJMYWJlbD1mYWxzZV0gLSB3aGVuIHNldCB0byB0cnVlIGxhYmVscyB3aWxsIGFwcGVhciBhbG9uZyBzaWRlIGxpbmtzIGluIHRoZVxuICogZ3JhcGguICoqTm90ZSoqOiB0aGlzIHdpbGwgb25seSBoYXBwZW4gb2YgY291cnNlIGlmIHByb3BlciBsYWJlbCBpcyBwYXNzZWQgd2l0aGluIHRoZSBsaW5rLCBjaGVjayBhbHNvIGBsaW5rLmxhYmVsUHJvcGVydHlgLlxuICogPGJyLz5cbiAqIDxpbWcgc3JjPVwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGNhbGRhcy9yZWFjdC1kMy1ncmFwaC9ibG9iL21hc3Rlci9kb2NzL3JkM2ctbGluay1yZW5kZXItbGFiZWwucG5nP3Jhdz10cnVlXCIgd2lkdGg9XCI4MjBcIiBoZWlnaHQ9XCI0ODBcIi8+XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsaW5rLnNlbWFudGljU3Ryb2tlV2lkdGg9ZmFsc2VdIC0gd2hlbiBzZXQgdG8gdHJ1ZSBhbGwgbGlua3Mgd2lsbCBoYXZlXG4gKiAqXCJzZW1hbnRpYyB3aWR0aFwiKiwgdGhpcyBtZWFucyB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgY29ubmVjdGlvbnMgd2lsbCBiZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHZhbHVlIG9mIGVhY2ggbGluay5cbiAqIFRoaXMgaXMgaG93IGxpbmsgc3Ryb2tlV2lkdGggd2lsbCBiZSBjYWxjdWxhdGVkOlxuICogYGBgamF2YXNjcmlwdFxuICogc3Ryb2tlV2lkdGggKz0gKGxpbmtWYWx1ZSAqIHN0cm9rZVdpZHRoKSAvIDEwO1xuICogYGBgXG4gKiBAcGFyYW0ge251bWJlcn0gW2xpbmsuc3Ryb2tlV2lkdGg9MS41XSDwn5SN8J+UjfCflI0gLSBzdHJva2VXaWR0aCBmb3IgYWxsIGxpbmtzLiBCeSBkZWZhdWx0IHRoZSBhY3R1YWwgdmFsdWUgaXMgb2J0YWluIGJ5IHRoZVxuICogZm9sbG93aW5nIGV4cHJlc3Npb246XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBsaW5rLnN0cm9rZVdpZHRoICogKDEgLyB0cmFuc2Zvcm0pOyAvLyB0cmFuc2Zvcm0gaXMgYSB6b29tIGRlbHRhIM6UIHZhbHVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGluay50eXBlPVwiU1RSQUlHSFRcIl0gLSB0aGUgdHlwZSBvZiBsaW5lIHRvIGRyYXcsIGF2YWlsYWJsZSB0eXBlcyBhdCB0aGlzIHBvaW50IGFyZTpcbiAqIC0gXCJTVFJBSUdIVFwiIDxzbWFsbD4oZGVmYXVsdCk8L3NtYWxsPiAtIGEgc3RyYWlnaHQgbGluZS5cbiAqIC0gXCJDVVJWRV9TTU9PVEhcIiAtIGEgc2xpZ2h0IGN1cnZlIGJldHdlZW4gdHdvIG5vZGVzXG4gKiAtIFwiQ1VSVkVfRlVMTFwiIC0gYSBzZW1pY2lyY3VtZmVyZW5jZSB0cmFqZWN0b3J5IHVuaXRlcyBzb3VyY2UgYW5kIHRhcmdldCBub2Rlcy5cbiAqIDxici8+XG4gKiA8aW1nIHNyYz1cImh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxjYWxkYXMvcmVhY3QtZDMtZ3JhcGgvYmxvYi9tYXN0ZXIvZG9jcy9yZDNnLWJlbmQuZ2lmP3Jhdz10cnVlXCIgd2lkdGg9XCI4MjBcIiBoZWlnaHQ9XCI0ODBcIi8+XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEEgc2ltcGxlIGNvbmZpZyB0aGF0IHVzZXMgc29tZSBwcm9wZXJ0aWVzXG4gKiBjb25zdCBteUNvbmZpZyA9IHtcbiAqICAgICBub2RlSGlnaGxpZ2h0QmVoYXZpb3I6IHRydWUsXG4gKiAgICAgbm9kZToge1xuICogICAgICAgICBjb2xvcjogXCJsaWdodGdyZWVuXCIsXG4gKiAgICAgICAgIHNpemU6IDEyMCxcbiAqICAgICAgICAgaGlnaGxpZ2h0U3Ryb2tlQ29sb3I6IFwiYmx1ZVwiXG4gKiAgICAgfSxcbiAqICAgICBsaW5rOiB7XG4gKiAgICAgICAgIGhpZ2hsaWdodENvbG9yOiBcImxpZ2h0Ymx1ZVwiXG4gKiAgICAgfVxuICogfTtcbiAqXG4gKiAvLyBTb3JyeSBmb3IgdGhlIGxvbmcgY29uZmlnIGRlc2NyaXB0aW9uLCBoZXJlXCJzIGEgcG90YXRvIPCfpZQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBhdXRvbWF0aWNSZWFycmFuZ2VBZnRlckRyb3BOb2RlOiBmYWxzZSxcbiAgICBjb2xsYXBzaWJsZTogZmFsc2UsXG4gICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgIGZvY3VzQW5pbWF0aW9uRHVyYXRpb246IDAuNzUsXG4gICAgZm9jdXNab29tOiAxLFxuICAgIGhlaWdodDogNDAwLFxuICAgIGhpZ2hsaWdodERlZ3JlZTogMSxcbiAgICBoaWdobGlnaHRPcGFjaXR5OiAxLFxuICAgIGxpbmtIaWdobGlnaHRCZWhhdmlvcjogZmFsc2UsXG4gICAgbWF4Wm9vbTogOCxcbiAgICBtaW5ab29tOiAwLjEsXG4gICAgbm9kZUhpZ2hsaWdodEJlaGF2aW9yOiBmYWxzZSxcbiAgICBwYW5BbmRab29tOiBmYWxzZSxcbiAgICBzdGF0aWNHcmFwaDogZmFsc2UsXG4gICAgd2lkdGg6IDgwMCxcbiAgICBkMzoge1xuICAgICAgICBhbHBoYVRhcmdldDogMC4wNSxcbiAgICAgICAgZ3Jhdml0eTogLTEwMCxcbiAgICAgICAgbGlua0xlbmd0aDogMTAwLFxuICAgICAgICBsaW5rU3RyZW5ndGg6IDEsXG4gICAgfSxcbiAgICBub2RlOiB7XG4gICAgICAgIGNvbG9yOiBcIiNkM2QzZDNcIixcbiAgICAgICAgZm9udENvbG9yOiBcImJsYWNrXCIsXG4gICAgICAgIGZvbnRTaXplOiA4LFxuICAgICAgICBmb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBoaWdobGlnaHRDb2xvcjogXCJTQU1FXCIsXG4gICAgICAgIGhpZ2hsaWdodEZvbnRTaXplOiA4LFxuICAgICAgICBoaWdobGlnaHRGb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICBoaWdobGlnaHRTdHJva2VDb2xvcjogXCJTQU1FXCIsXG4gICAgICAgIGhpZ2hsaWdodFN0cm9rZVdpZHRoOiBcIlNBTUVcIixcbiAgICAgICAgbGFiZWxQcm9wZXJ0eTogXCJpZFwiLFxuICAgICAgICBtb3VzZUN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHJlbmRlckxhYmVsOiB0cnVlLFxuICAgICAgICBzaXplOiAyMDAsXG4gICAgICAgIHN0cm9rZUNvbG9yOiBcIm5vbmVcIixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDEuNSxcbiAgICAgICAgc3ZnOiBcIlwiLFxuICAgICAgICBzeW1ib2xUeXBlOiBcImNpcmNsZVwiLFxuICAgICAgICB2aWV3R2VuZXJhdG9yOiBudWxsLFxuICAgIH0sXG4gICAgbGluazoge1xuICAgICAgICBjb2xvcjogXCIjZDNkM2QzXCIsXG4gICAgICAgIGZvbnRDb2xvcjogXCJibGFja1wiLFxuICAgICAgICBmb250U2l6ZTogOCxcbiAgICAgICAgZm9udFdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFwiI2QzZDNkM1wiLFxuICAgICAgICBoaWdobGlnaHRGb250U2l6ZTogOCxcbiAgICAgICAgaGlnaGxpZ2h0Rm9udFdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgbGFiZWxQcm9wZXJ0eTogXCJsYWJlbFwiLFxuICAgICAgICBtb3VzZUN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHJlbmRlckxhYmVsOiBmYWxzZSxcbiAgICAgICAgc2VtYW50aWNTdHJva2VXaWR0aDogZmFsc2UsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLjUsXG4gICAgICAgIHR5cGU6IFwiU1RSQUlHSFRcIixcbiAgICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQkE7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBZEE7QUEzQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45\n')},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(98),\n getRawTag = __webpack_require__(353),\n objectToString = __webpack_require__(354);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcz8xODhkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n")},function(module,exports){eval("/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanM/NGZkNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47\n")},function(module,exports){eval("/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzPzNlYTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///48\n")},function(module,exports){eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanM/NzJkZiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49\n")},function(module,exports){eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzPzkwMTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\n\nvar _iterator = __webpack_require__(113);\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = __webpack_require__(198);\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {\n return typeof obj === "undefined" ? "undefined" : _typeof(obj);\n} : function (obj) {\n return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YuanM/YzJmZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n')},function(module,exports,__webpack_require__){eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(16);\nvar dPs = __webpack_require__(196);\nvar enumBugKeys = __webpack_require__(71);\nvar IE_PROTO = __webpack_require__(69)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(73)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(115).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzFiZTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///52\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(197);\nvar global = __webpack_require__(6);\nvar hide = __webpack_require__(21);\nvar Iterators = __webpack_require__(40);\nvar TO_STRING_TAG = __webpack_require__(7)('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanM/OTNmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG52YXIgRE9NSXRlcmFibGVzID0gKCdDU1NSdWxlTGlzdCxDU1NTdHlsZURlY2xhcmF0aW9uLENTU1ZhbHVlTGlzdCxDbGllbnRSZWN0TGlzdCxET01SZWN0TGlzdCxET01TdHJpbmdMaXN0LCcgK1xuICAnRE9NVG9rZW5MaXN0LERhdGFUcmFuc2Zlckl0ZW1MaXN0LEZpbGVMaXN0LEhUTUxBbGxDb2xsZWN0aW9uLEhUTUxDb2xsZWN0aW9uLEhUTUxGb3JtRWxlbWVudCxIVE1MU2VsZWN0RWxlbWVudCwnICtcbiAgJ01lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsJyArXG4gICdTVkdQYXRoU2VnTGlzdCxTVkdQb2ludExpc3QsU1ZHU3RyaW5nTGlzdCxTVkdUcmFuc2Zvcm1MaXN0LFNvdXJjZUJ1ZmZlckxpc3QsU3R5bGVTaGVldExpc3QsVGV4dFRyYWNrQ3VlTGlzdCwnICtcbiAgJ1RleHRUcmFja0xpc3QsVG91Y2hMaXN0Jykuc3BsaXQoJywnKTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCBET01JdGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBET01JdGVyYWJsZXNbaV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _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; };\n\nvar _const = __webpack_require__(145);\n\nvar _const2 = _interopRequireDefault(_const);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _extends({\n COORDS_SEPARATOR: ",",\n FORCE_X: 0.06,\n FORCE_Y: 0.06,\n GRAPH_CONTAINER_ID: "graph-container-zoomable",\n GRAPH_WRAPPER_ID: "graph-wrapper",\n KEYWORDS: {\n SAME: "SAME"\n },\n LINK_CLASS_NAME: "link",\n NODE_CLASS_NAME: "node"\n}, _const2.default);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vc3JjL2NvbXBvbmVudHMvZ3JhcGgvZ3JhcGguY29uc3QuanM/ZWM0MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ09OU1QgZnJvbSBcIi4uLy4uL2NvbnN0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBDT09SRFNfU0VQQVJBVE9SOiBcIixcIixcbiAgICBGT1JDRV9YOiAwLjA2LFxuICAgIEZPUkNFX1k6IDAuMDYsXG4gICAgR1JBUEhfQ09OVEFJTkVSX0lEOiBcImdyYXBoLWNvbnRhaW5lci16b29tYWJsZVwiLFxuICAgIEdSQVBIX1dSQVBQRVJfSUQ6IFwiZ3JhcGgtd3JhcHBlclwiLFxuICAgIEtFWVdPUkRTOiB7XG4gICAgICAgIFNBTUU6IFwiU0FNRVwiLFxuICAgIH0sXG4gICAgTElOS19DTEFTU19OQU1FOiBcImxpbmtcIixcbiAgICBOT0RFX0NMQVNTX05BTUU6IFwibm9kZVwiLFxuICAgIC4uLkNPTlNULFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBOzs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };\n\n/**\n * @module utils\n * @description\n * Offers a series of generic methods for object manipulation, and other operations\n * that are common across rd3g such as error logging.\n */\n\n// This variable assures that recursive methods such as merge and isDeepEqual do not fall on\n// circular JSON structure evaluation.\nvar MAX_DEPTH = 20;\n\n/**\n * Checks whether a certain object property is from object type and is a non empty object.\n * @param {Object} o - the object.\n * @param {string} k - the object property.\n * @returns {boolean} returns true if o[k] is an non empty object.\n * @memberof utils\n */\nfunction _isPropertyNestedObject(o, k) {\n return !!o && o.hasOwnProperty(k) && _typeof(o[k]) === "object" && o[k] !== null && !isEmptyObject(o[k]);\n}\n\n/**\n * Generic deep comparison between javascript simple or complex objects.\n * @param {Object} o1 - one of the objects to be compared.\n * @param {Object} o2 - second object to compare with first.\n * @param {number} [_depth=0] - this parameter serves only for internal usage.\n * @returns {boolean} returns true if o1 and o2 have exactly the same content, or are exactly the same object reference.\n * @memberof utils\n */\nfunction isDeepEqual(o1, o2) {\n var _depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n var diffs = [];\n\n if (_depth === 0 && o1 === o2) {\n return true;\n }\n\n if (isEmptyObject(o1) && !isEmptyObject(o2) || !isEmptyObject(o1) && isEmptyObject(o2)) {\n return false;\n }\n\n var o1Keys = Object.keys(o1);\n var o2Keys = Object.keys(o2);\n\n if (o1Keys.length !== o2Keys.length) {\n return false;\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = o1Keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var k = _step.value;\n\n var nestedO = _isPropertyNestedObject(o1, k) && _isPropertyNestedObject(o2, k);\n\n if (nestedO && _depth < MAX_DEPTH) {\n diffs.push(isDeepEqual(o1[k], o2[k], _depth + 1));\n } else {\n var r = isEmptyObject(o1[k]) && isEmptyObject(o2[k]) || o2.hasOwnProperty(k) && o2[k] === o1[k];\n\n diffs.push(r);\n\n if (!r) {\n break;\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return diffs.indexOf(false) === -1;\n}\n\n/**\n * Checks whether or not a certain object is empty.\n * NOTE: If the passed parameter is not an object the method return false.\n * @param {Object} o - object whom emptiness we want to check.\n * @returns {boolean} true if the given object is n ft and object and is empty.\n * @memberof utils\n */\nfunction isEmptyObject(o) {\n return !!o && (typeof o === "undefined" ? "undefined" : _typeof(o)) === "object" && !Object.keys(o).length;\n}\n\n/**\n * Function to deep clone plain javascript objects.\n * @param {Object} o - the object to clone.\n * @param {Object} _clone - carries the cloned output throughout the\n * recursive calls. Parameter serves only for internal usage.\n * @param {number} _depth - this parameter serves only for internal usage.\n * @returns {Object} - the cloned object.\n * @memberof utils\n */\nfunction deepClone(o) {\n var _clone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n // TODO: Handle invalid input o is null, undefined, empty object\n var oKeys = Object.keys(o);\n\n // TODO: handle arrays\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = oKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var k = _step2.value;\n\n var nested = _isPropertyNestedObject(o, k);\n\n _clone[k] = nested && _depth < MAX_DEPTH ? deepClone(o[k], {}, _depth + 1) : o[k];\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return _clone;\n}\n\n/**\n * This function merges two objects o1 and o2, where o2 properties override existent o1 properties, and\n * if o2 doesn\'t posses some o1 property the fallback will be the o1 property.\n * @param {Object} o1 - object.\n * @param {Object} o2 - object that will override o1 properties.\n * @param {int} [_depth=0] - the depth at which we are merging the object.\n * @returns {Object} object that is the result of merging o1 and o2, being o2 properties priority overriding\n * existent o1 properties.\n * @memberof utils\n */\nfunction merge() {\n var o1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var o2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n var o = {};\n\n if (Object.keys(o1 || {}).length === 0) {\n return o2 && !isEmptyObject(o2) ? o2 : {};\n }\n\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = Object.keys(o1)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var k = _step3.value;\n\n var nestedO = !!(o2[k] && _typeof(o2[k]) === "object" && _typeof(o1[k]) === "object" && _depth < MAX_DEPTH);\n\n if (nestedO) {\n (function () {\n var r = merge(o1[k], o2[k], _depth + 1);\n\n o[k] = o1[k].hasOwnProperty("length") && o2[k].hasOwnProperty("length") ? Object.keys(r).map(function (rk) {\n return r[rk];\n }) : r;\n })();\n } else {\n o[k] = o2.hasOwnProperty(k) ? o2[k] : o1[k];\n }\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n\n return o;\n}\n\n/**\n * Create new object from the inputted one only with the props passed\n * in the props list.\n * @param {Object} o - the object to pick props from.\n * @param {Array.