cytoscape-angular-ng17
Version:
Angular 17+ components for cytoscape charting.
178 lines • 24.9 kB
JavaScript
class BaseLayoutOptionsImpl {
ready(e) {
// tslint:disable-next-line:no-console
console.debug(`layout ready, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutready
}
stop(e) {
// tslint:disable-next-line:no-console
console.debug(`layout stop, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutstop
}
}
export class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl {
name = 'null';
}
export class AnimateLayoutOptionsImpl extends BaseLayoutOptionsImpl {
// the zoom level to set (prob want fit = false if set)
zoom = undefined;
// the pan level to set (prob want fit = false if set)
pan = undefined;
// whether to transition the node positions
animate = false;
// duration of animation in ms if enabled
animationDuration = 500;
// easing of animation if enabled
animationEasing = undefined;
// a function that determines whether the node should be animated.
// All nodes animated by default on animate enabled. Non-animated nodes are
// positioned immediately when the layout starts
animateFilter = (node, i) => true;
}
export class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl {
name = 'preset';
fit;
padding;
// map of (node id) => (position obj); or function(node){ return somPos; }
positions;
// transform a given node position. Useful for changing flow direction in discrete layouts
transform = (node, position) => position;
}
export class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl {
// whether to fit to viewport
fit = true;
// fit padding
padding = 30;
// constrain layout bounds
boundingBox = undefined;
// prevents node overlap, may overflow boundingBox if not enough space
avoidOverlap = true;
// Excludes the label when calculating node bounding boxes for the layout algorithm
nodeDimensionsIncludeLabels = false;
// Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
spacingFactor = 1.75;
// a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }
sort = undefined;
// transform a given node position. Useful for changing flow direction in discrete layouts
transform = (node, position) => position;
}
export class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl {
name = 'grid';
// extra spacing around nodes when avoidOverlap: true
avoidOverlapPadding = 10;
// uses all available space on false, uses minimal space on true
condense = false;
// force num of rows in the grid
rows = undefined;
// force num of columns in the grid
cols = undefined;
// returns { row, col } for element
// (node: NodeSingular) => return { row: number; col: number; }
position = null;
}
export class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl {
name = 'random';
fit = true;
padding = 20;
// constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
boundingBox = undefined;
// transform a given node position. Useful for changing flow direction in discrete layouts
transform = (node, position) => position;
}
export class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl {
name = 'circle';
radius; // the radius of the circle
startAngle = (3 / 2) * Math.PI; // where nodes start in radians
sweep = undefined; // how many radians should be between the first and last node (defaults to full circle)
clockwise; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)
}
// Note: "radius" is not part of concentric, imperfect extension
export class ConcentricLayoutOptionsImpl {
name = 'concentric';
// how many radians should be between the first and last node (defaults to full circle)
sweep;
// whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)
clockwise;
// where nodes start in radians, e.g. 3 / 2 * Math.PI,
startAngle = (3 / 2) * Math.PI;
fit;
nodeDimensionsIncludeLabels;
equidistant; // whether levels have an equal radial distance betwen them, may cause bounding box overflow
minNodeSpacing = 10; // min spacing between outside of nodes (used for radius adjustment)
boundingBox; // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
// height of layout area (overrides container height)
height = null;
// width of layout area (overrides container width)
width = null;
// Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
spacingFactor;
concentric(node) {
return 0;
}
levelWidth(node) {
return 0;
}
}
export class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl {
name = 'breadthfirst';
// whether the tree is directed downwards (or edges can point in any direction if false)
directed = false;
// put depths in concentric circles if true, put depths top down if false
circle = false;
// the roots of the trees
roots;
// how many times to try to position the nodes in a maximal way (i.e. no backtracking)
maximalAdjustments;
// whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)
maximal = false;
grid = false; // whether to create an even grid into which the DAG is placed (circle:false only)
nodeDimensionsIncludeLabels = false; // Excludes the label when calculating node bounding boxes for the layout algorithm
}
export class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl {
name = 'cose';
// The layout animates only after this many milliseconds for animate:true
// (prevents flashing on fast runs)
animationThreshold = 250;
// Number of iterations between consecutive screen positions update
refresh = 20;
// Randomize the initial positions of the nodes (true) or use existing positions (false)
randomize = false;
// Extra spacing between components in non-compound graphs
componentSpacing = 40;
// Node repulsion (overlapping) multiplier
nodeOverlap = 4;
// Nesting factor (multiplier) to compute ideal edge length for nested edges
nestingFactor = 1.2;
// Gravity force (constant)
gravity = 1;
// Maximum number of iterations to perform
numIter = 1000;
// Initial temperature (maximum node displacement)
initialTemp = 1000;
// Cooling factor (how the temperature is reduced between consecutive iterations
coolingFactor = 0.99;
// Lower temperature threshold (below this point the layout will end)
minTemp = 1.0;
// Node repulsion (non overlapping) multiplier
nodeRepulsion = (node) => 2048;
// Ideal edge (non nested) length
idealEdgeLength = (edge) => 32;
// Divisor to compute edge forces
edgeElasticity = (edge) => 32;
}
export class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl {
constructor() {
super();
}
name = 'dagre';
nodeSep = undefined; // the separation between adjacent nodes in the same rank
edgeSep = undefined; // the separation between adjacent edges in the same rank
rankSep = undefined; // the separation between each rank in the layout
// TB for top to bottom flow, 'LR' for left to right
rankDir = 'TB';
// Type of algorithm to assign a rank to each node in the input graph.
// Possible values: 'network-simplex', 'tight-tree' or 'longest-path'
ranker = undefined;
// number of ranks to keep between the source and target of the edge
minLen = (edge) => 1;
edgeWeight = (edge) => 1; // higher weight edges are generally made shorter and straighter than lower weight edges
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW9wdGlvbnMtaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvbGF5b3V0L2xheW91dC1vcHRpb25zLWltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxxQkFBcUI7SUFDekIsS0FBSyxDQUFDLENBQThCO1FBQ2xDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xFLENBQUMsQ0FBQyxpQkFBaUI7SUFDdEIsQ0FBQztJQUVELElBQUksQ0FBQyxDQUE4QjtRQUNqQyxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCw2Q0FBNkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNqRSxDQUFDLENBQUMsZ0JBQWdCO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxxQkFBcUI7SUFDOUQsSUFBSSxHQUFHLE1BQU0sQ0FBQztDQUNmO0FBRUQsTUFBTSxPQUFPLHdCQUNYLFNBQVEscUJBQXFCO0lBRzdCLHVEQUF1RDtJQUN2RCxJQUFJLEdBQVksU0FBUyxDQUFDO0lBQzFCLHNEQUFzRDtJQUN0RCxHQUFHLEdBQVksU0FBUyxDQUFDO0lBQ3pCLDJDQUEyQztJQUMzQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLHlDQUF5QztJQUN6QyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIsaUNBQWlDO0lBQ2pDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDNUIsa0VBQWtFO0lBQ2xFLDRFQUE0RTtJQUM1RSxnREFBZ0Q7SUFDaEQsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ25DO0FBRUQsTUFBTSxPQUFPLHVCQUF3QixTQUFR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LEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztJQUUvQixpQ0FBaUM7SUFDakMsZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFL0IsaUNBQWlDO0lBQ2pDLGNBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CO0FBS0QsTUFBTSxPQUFPLHNCQUF1QixTQUFRLHVCQUF1QjtJQUNqRTtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVELElBQUksR0FBRyxPQUFPLENBQUM7SUFFZixPQUFPLEdBQVksU0FBUyxDQUFDLENBQUMseURBQXlEO0lBQ3ZGLE9BQU8sR0FBWSxTQUFTLENBQUMsQ0FBQyx5REFBeUQ7SUFDdkYsT0FBTyxHQUFZLFNBQVMsQ0FBQyxDQUFDLGlEQUFpRDtJQUMvRSxvREFBb0Q7SUFDcEQsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixzRUFBc0U7SUFDdEUscUVBQXFFO0lBQ3JFLE1BQU0sR0FBWSxTQUFTLENBQUM7SUFDNUIsb0VBQW9FO0lBQ3BFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsd0ZBQXdGO0NBQ25IIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQW5pbWF0ZWRMYXlvdXRPcHRpb25zLFxuICBCb3VuZGluZ0JveDEyLFxuICBCb3VuZGluZ0JveFdILFxuICBTb3J0aW5nRnVuY3Rpb24sXG59IGZyb20gJ2N5dG9zY2FwZSc7XG5cbmNsYXNzIEJhc2VMYXlvdXRPcHRpb25zSW1wbCB7XG4gIHJlYWR5KGU6IGN5dG9zY2FwZS5MYXlvdXRFdmVudE9iamVjdCk6IHZvaWQge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgIGBsYXlvdXQgcmVhZHksIGN5dG9zY2FwZS5MYXlvdXRFdmVudE9iamVjdDogJHtKU09OLnN0cmluZ2lmeShlKX1gXG4gICAgKTsgLy8gb24gbGF5b3V0cmVhZHlcbiAgfVxuXG4gIHN0b3AoZTogY3l0b3NjYXBlLkxheW91dEV2ZW50T2JqZWN0KTogdm9pZCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgYGxheW91dCBzdG9wLCBjeXRvc2NhcGUuTGF5b3V0RXZlbnRPYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YFxuICAgICk7IC8vIG9uIGxheW91dHN0b3BcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTnVsbExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgQmFzZUxheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdudWxsJztcbn1cblxuZXhwb3J0IGNsYXNzIEFuaW1hdGVMYXlvdXRPcHRpb25zSW1wbFxuICBleHRlbmRzIEJhc2VMYXlvdXRPcHRpb25zSW1wbFxuICBpbXBsZW1lbnRzIEFuaW1hdGVkTGF5b3V0T3B0aW9uc1xue1xuICAvLyB0aGUgem9vbSBsZXZlbCB0byBzZXQgKHByb2Igd2FudCBmaXQgPSBmYWxzZSBpZiBzZXQpXG4gIHpvb20/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBwYW4/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0ZSA9IGZhbHNlO1xuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25EdXJhdGlvbiA9IDUwMDtcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZyA9IHVuZGVmaW5lZDtcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuXG4gIC8vIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmVcbiAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIGFuaW1hdGVGaWx0ZXIgPSAobm9kZSwgaSkgPT4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFByZXNldExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgQW5pbWF0ZUxheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdwcmVzZXQnO1xuXG4gIGZpdD86IGJvb2xlYW47XG4gIHBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLy8gbWFwIG9mIChub2RlIGlkKSA9PiAocG9zaXRpb24gb2JqKTsgb3IgZnVuY3Rpb24obm9kZSl7IHJldHVybiBzb21Qb3M7IH1cbiAgcG9zaXRpb25zPzogbnVsbDtcbiAgLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG4gIHRyYW5zZm9ybSA9IChub2RlLCBwb3NpdGlvbikgPT4gcG9zaXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIEFuaW1hdGVMYXlvdXRPcHRpb25zSW1wbCB7XG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIGZpdCA9IHRydWU7XG4gIC8vIGZpdCBwYWRkaW5nXG4gIHBhZGRpbmcgPSAzMDtcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHNcbiAgYm91bmRpbmdCb3g/OiBCb3VuZGluZ0JveDEyIHwgQm91bmRpbmdCb3hXSCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIGF2b2lkT3ZlcmxhcCA9IHRydWU7XG5cbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzID0gZmFsc2U7XG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIHNwYWNpbmdGYWN0b3IgPSAxLjc1O1xuXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIHNvcnQ/OiBTb3J0aW5nRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gIC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuICB0cmFuc2Zvcm0gPSAobm9kZSwgcG9zaXRpb24pID0+IHBvc2l0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgR3JpZExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ2dyaWQnO1xuXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIGF2b2lkT3ZlcmxhcFBhZGRpbmcgPSAxMDtcbiAgLy8gdXNlcyBhbGwgYXZhaWxhYmxlIHNwYWNlIG9uIGZhbHNlLCB1c2VzIG1pbmltYWwgc3BhY2Ugb24gdHJ1ZVxuICBjb25kZW5zZSA9IGZhbHNlO1xuICAvLyBmb3JjZSBudW0gb2Ygcm93cyBpbiB0aGUgZ3JpZFxuICByb3dzPzogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBjb2xzPzogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvLyByZXR1cm5zIHsgcm93LCBjb2wgfSBmb3IgZWxlbWVudFxuICAvLyAobm9kZTogTm9kZVNpbmd1bGFyKSA9PiByZXR1cm4geyByb3c6IG51bWJlcjsgY29sOiBudW1iZXI7IH1cbiAgcG9zaXRpb24gPSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgUmFuZG9tTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBBbmltYXRlTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ3JhbmRvbSc7XG5cbiAgZml0ID0gdHJ1ZTtcbiAgcGFkZGluZyA9IDIwO1xuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYm91bmRpbmdCb3g6IGN5dG9zY2FwZS5Cb3VuZGluZ0JveDEyIHwgY3l0b3NjYXBlLkJvdW5kaW5nQm94V0ggfCB1bmRlZmluZWQgPVxuICAgIHVuZGVmaW5lZDtcbiAgLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG4gIHRyYW5zZm9ybSA9IChub2RlLCBwb3NpdGlvbikgPT4gcG9zaXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBDaXJjbGVMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIFNoYXBlZExheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdjaXJjbGUnO1xuXG4gIHJhZGl1cz86IG51bWJlcjsgLy8gdGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlXG4gIHN0YXJ0QW5nbGU6IG51bWJlciA9ICgzIC8gMikgKiBNYXRoLlBJOyAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwPzogbnVtYmVyID0gdW5kZWZpbmVkOyAvLyBob3cgbWFueSByYWRpYW5zIHNob3VsZCBiZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIChkZWZhdWx0cyB0byBmdWxsIGNpcmNsZSlcbiAgY2xvY2t3aXNlPzogdHJ1ZTsgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG59XG5cbi8vIE5vdGU6IFwicmFkaXVzXCIgaXMgbm90IHBhcnQgb2YgY29uY2VudHJpYywgaW1wZXJmZWN0IGV4dGVuc2lvblxuZXhwb3J0IGNsYXNzIENvbmNlbnRyaWNMYXlvdXRPcHRpb25zSW1wbCB7XG4gIG5hbWUgPSAnY29uY2VudHJpYyc7XG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBzd2VlcD86IG51bWJlcjtcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIGNsb2Nrd2lzZT86IGJvb2xlYW47XG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnMsIGUuZy4gMyAvIDIgKiBNYXRoLlBJLFxuICBzdGFydEFuZ2xlOiBudW1iZXIgPSAoMyAvIDIpICogTWF0aC5QSTtcbiAgZml0PzogYm9vbGVhbjtcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzPzogdHJ1ZTtcbiAgZXF1aWRpc3RhbnQ/OiBmYWxzZTsgLy8gd2hldGhlciBsZXZlbHMgaGF2ZSBhbiBlcXVhbCByYWRpYWwgZGlzdGFuY2UgYmV0d2VuIHRoZW0sIG1heSBjYXVzZSBib3VuZGluZyBib3ggb3ZlcmZsb3dcbiAgbWluTm9kZVNwYWNpbmc/ID0gMTA7IC8vIG1pbiBzcGFjaW5nIGJldHdlZW4gb3V0c2lkZSBvZiBub2RlcyAodXNlZCBmb3IgcmFkaXVzIGFkanVzdG1lbnQpXG4gIGJvdW5kaW5nQm94PzogYW55OyAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgaGVpZ2h0ID0gbnVsbDtcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHdpZHRoID0gbnVsbDtcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgc3BhY2luZ0ZhY3Rvcj86IG51bWJlcjtcblxuICBjb25jZW50cmljKG5vZGU6IHsgZGVncmVlKCk6IG51bWJlciB9KTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldmVsV2lkdGgobm9kZTogeyBtYXhEZWdyZWUoKTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCcmVhZHRoRmlyc3RMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIFNoYXBlZExheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdicmVhZHRoZmlyc3QnO1xuXG4gIC8vIHdoZXRoZXIgdGhlIHRyZWUgaXMgZGlyZWN0ZWQgZG93bndhcmRzIChvciBlZGdlcyBjYW4gcG9pbnQgaW4gYW55IGRpcmVjdGlvbiBpZiBmYWxzZSlcbiAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgLy8gcHV0IGRlcHRocyBpbiBjb25jZW50cmljIGNpcmNsZXMgaWYgdHJ1ZSwgcHV0IGRlcHRocyB0b3AgZG93biBpZiBmYWxzZVxuICBjaXJjbGUgPSBmYWxzZTtcbiAgLy8gdGhlIHJvb3RzIG9mIHRoZSB0cmVlc1xuICByb290cz86IHN0cmluZztcbiAgLy8gaG93IG1hbnkgdGltZXMgdG8gdHJ5IHRvIHBvc2l0aW9uIHRoZSBub2RlcyBpbiBhIG1heGltYWwgd2F5IChpLmUuIG5vIGJhY2t0cmFja2luZylcbiAgbWF4aW1hbEFkanVzdG1lbnRzPzogbnVtYmVyO1xuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSlcbiAgbWF4aW1hbCA9IGZhbHNlO1xuICBncmlkID0gZmFsc2U7IC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgb3ZlcnJpZGUgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzID0gZmFsc2U7IC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG59XG5cbmV4cG9ydCBjbGFzcyBDb3NlTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCB7XG4gIG5hbWUgPSAnY29zZSc7XG5cbiAgLy8gVGhlIGxheW91dCBhbmltYXRlcyBvbmx5IGFmdGVyIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgZm9yIGFuaW1hdGU6dHJ1ZVxuICAvLyAocHJldmVudHMgZmxhc2hpbmcgb24gZmFzdCBydW5zKVxuICBhbmltYXRpb25UaHJlc2hvbGQgPSAyNTA7XG5cbiAgLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbnMgYmV0d2VlbiBjb25zZWN1dGl2ZSBzY3JlZW4gcG9zaXRpb25zIHVwZGF0ZVxuICByZWZyZXNoID0gMjA7XG5cbiAgLy8gUmFuZG9taXplIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgKHRydWUpIG9yIHVzZSBleGlzdGluZyBwb3NpdGlvbnMgKGZhbHNlKVxuICByYW5kb21pemUgPSBmYWxzZTtcblxuICAvLyBFeHRyYSBzcGFjaW5nIGJldHdlZW4gY29tcG9uZW50cyBpbiBub24tY29tcG91bmQgZ3JhcGhzXG4gIGNvbXBvbmVudFNwYWNpbmcgPSA0MDtcblxuICAvLyBOb2RlIHJlcHVsc2lvbiAob3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZU92ZXJsYXAgPSA0O1xuXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvciA9IDEuMjtcblxuICAvLyBHcmF2aXR5IGZvcmNlIChjb25zdGFudClcbiAgZ3Jhdml0eSA9IDE7XG5cbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtXG4gIG51bUl0ZXIgPSAxMDAwO1xuXG4gIC8vIEluaXRpYWwgdGVtcGVyYXR1cmUgKG1heGltdW0gbm9kZSBkaXNwbGFjZW1lbnQpXG4gIGluaXRpYWxUZW1wID0gMTAwMDtcblxuICAvLyBDb29saW5nIGZhY3RvciAoaG93IHRoZSB0ZW1wZXJhdHVyZSBpcyByZWR1Y2VkIGJldHdlZW4gY29uc2VjdXRpdmUgaXRlcmF0aW9uc1xuICBjb29saW5nRmFjdG9yID0gMC45OTtcblxuICAvLyBMb3dlciB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgKGJlbG93IHRoaXMgcG9pbnQgdGhlIGxheW91dCB3aWxsIGVuZClcbiAgbWluVGVtcCA9IDEuMDtcblxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb24gPSAobm9kZSkgPT4gMjA0ODtcblxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoID0gKGVkZ2UpID0+IDMyO1xuXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eSA9IChlZGdlKSA9PiAzMjtcbn1cblxudHlwZSBSYW5rRGlyID0gJ0xSJyB8ICdUQic7XG50eXBlIFJhbmtlciA9ICduZXR3b3JrLXNpbXBsZXgnIHwgJ3RpZ2h0LXRyZWUnIHwgJ2xvbmdlc3QtcGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEYWdyZUxheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmFtZSA9ICdkYWdyZSc7XG5cbiAgbm9kZVNlcD86IG51bWJlciA9IHVuZGVmaW5lZDsgLy8gdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBhZGphY2VudCBub2RlcyBpbiB0aGUgc2FtZSByYW5rXG4gIGVkZ2VTZXA/OiBudW1iZXIgPSB1bmRlZmluZWQ7IC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwPzogbnVtYmVyID0gdW5kZWZpbmVkOyAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGVhY2ggcmFuayBpbiB0aGUgbGF5b3V0XG4gIC8vIFRCIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHRcbiAgcmFua0RpcjogUmFua0RpciA9ICdUQic7XG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbiBhIHJhbmsgdG8gZWFjaCBub2RlIGluIHRoZSBpbnB1dCBncmFwaC5cbiAgLy8gUG9zc2libGUgdmFsdWVzOiAnbmV0d29yay1zaW1wbGV4JywgJ3RpZ2h0LXRyZWUnIG9yICdsb25nZXN0LXBhdGgnXG4gIHJhbmtlcj86IFJhbmtlciA9IHVuZGVmaW5lZDtcbiAgLy8gbnVtYmVyIG9mIHJhbmtzIHRvIGtlZXAgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2YgdGhlIGVkZ2VcbiAgbWluTGVuID0gKGVkZ2UpID0+IDE7XG4gIGVkZ2VXZWlnaHQgPSAoZWRnZSkgPT4gMTsgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xufVxuIl19