Skip to content

Instantly share code, notes, and snippets.

@anubhavg-icpl
Created October 11, 2024 09:23
Show Gist options
  • Save anubhavg-icpl/0d3d71f63c28488d54be46aada94839e to your computer and use it in GitHub Desktop.
Save anubhavg-icpl/0d3d71f63c28488d54be46aada94839e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="1920mm"
height="1080mm"
viewBox="0 0 1920 1080"
version="1.1"
id="svg8"
sodipodi:docname="scanner_run_loop.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:ns1="https://launchpad.net/jessyink">
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker31403"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path31401" />
</marker>
<marker
style="overflow:visible"
id="marker30943"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path30941" />
</marker>
<marker
style="overflow:visible"
id="marker30487"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path30485" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mstart"
inkscape:isstock="true">
<path
transform="scale(0.4) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path15446" />
</marker>
<marker
style="overflow:visible"
id="marker29555"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path29553" />
</marker>
<marker
style="overflow:visible;"
id="marker29101"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path29099" />
</marker>
<marker
style="overflow:visible"
id="marker28943"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path28941" />
</marker>
<marker
style="overflow:visible;"
id="marker27665"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path27663" />
</marker>
<marker
style="overflow:visible;"
id="marker27655"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path27653" />
</marker>
<marker
style="overflow:visible"
id="marker18080"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path18078" />
</marker>
<marker
style="overflow:visible;"
id="marker17656"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path17654" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lstart"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path15440" />
</marker>
<marker
style="overflow:visible"
id="marker13929"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path13927" />
</marker>
<marker
style="overflow:visible"
id="marker12687"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path12685" />
</marker>
<marker
style="overflow:visible"
id="marker8811"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path8809" />
</marker>
<marker
style="overflow:visible"
id="marker7947"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path7945" />
</marker>
<marker
style="overflow:visible"
id="marker7601"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path7599" />
</marker>
<marker
style="overflow:visible"
id="marker4956"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954" />
</marker>
<marker
style="overflow:visible"
id="marker3723"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3721" />
</marker>
<rect
x="44.097449"
y="87.617534"
width="175.39589"
height="33.830341"
id="rect3484" />
<rect
x="249.39339"
y="266.99842"
width="23.973364"
height="5.6978244"
id="rect1398" />
<marker
style="overflow:visible"
id="marker19130"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path19128" />
</marker>
<marker
style="overflow:visible"
id="marker16508"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path16506" />
</marker>
<marker
style="overflow:visible"
id="marker16228"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path16226" />
</marker>
<marker
style="overflow:visible"
id="marker14436"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path14434" />
</marker>
<marker
style="overflow:visible"
id="marker13726"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path13724" />
</marker>
<marker
style="overflow:visible"
id="marker13528"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path13526" />
</marker>
<marker
style="overflow:visible"
id="marker12818"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path12816" />
</marker>
<marker
style="overflow:visible"
id="marker10744"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path10742" />
</marker>
<marker
style="overflow:visible"
id="marker10576"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path10574" />
</marker>
<rect
x="85.929045"
y="159.06263"
width="10.687812"
height="2.4138921"
id="rect9897" />
<marker
style="overflow:visible"
id="marker9018"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path9016" />
</marker>
<marker
style="overflow:visible"
id="marker8532"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path8530" />
</marker>
<marker
style="overflow:visible"
id="marker5173"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path5171" />
</marker>
<marker
style="overflow:visible"
id="marker3491"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489" />
</marker>
<marker
style="overflow:visible"
id="marker2956"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2954" />
</marker>
<marker
style="overflow:visible;"
id="marker2874"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2872" />
</marker>
<marker
style="overflow:visible;"
id="marker2798"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2796" />
</marker>
<marker
style="overflow:visible;"
id="marker2728"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2726" />
</marker>
<marker
style="overflow:visible;"
id="marker2438"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.4) rotate(180) translate(10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path2436" />
</marker>
<marker
style="overflow:visible;"
id="Arrow1Lend"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="scale(0.8) rotate(180) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path1141" />
</marker>
<rect
x="145.03497"
y="131.79876"
width="32.207724"
height="14.536361"
id="rect179" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 300 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="800 : 300 : 1"
inkscape:persp3d-origin="400 : 200 : 1"
id="perspective167" />
<marker
style="overflow:visible"
id="Arrow1Mend-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1147-2" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-1"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1147-29" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1147-4" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-9-3"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1147-4-6" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend-9-3-0"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1147-4-6-6" />
</marker>
<marker
style="overflow:visible"
id="marker3491-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-0" />
</marker>
<marker
style="overflow:visible"
id="marker2438-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2436-5" />
</marker>
<marker
style="overflow:visible"
id="marker2438-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2436-3" />
</marker>
<marker
style="overflow:visible"
id="marker3491-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5" />
</marker>
<marker
style="overflow:visible"
id="marker2438-9-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path2436-3-6" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875"
x="-inf"
width="inf"
y="-0.53225755"
height="1.6377873">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877" />
</filter>
<marker
style="overflow:visible"
id="marker3491-4-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-6"
x="-0.010376962"
width="1.0324013"
y="-0.29780814"
height="1.3354836">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-7" />
</filter>
<marker
style="overflow:visible"
id="marker3491-4-6-3"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-6" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-6-1"
x="-0.0040770445"
width="1.0081541"
y="-0.028288421"
height="1.0565768">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-7-1" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9"
x="-0.0048065433"
width="1.0096131"
y="-0.009784574"
height="1.0195691">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77" />
</filter>
<marker
style="overflow:visible"
id="marker3491-4-6-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-1" />
</marker>
<marker
style="overflow:visible"
id="marker12818-3"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path12816-6" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0"
x="-0.0006997853"
width="1.0013996"
y="-0.0027662101"
height="1.0055324">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1"
x="-0.00073316412"
width="1.0014663"
y="-0.0021921122"
height="1.0043842">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0" />
</filter>
<marker
style="overflow:visible"
id="marker3491-4-6-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-0" />
</marker>
<marker
style="overflow:visible"
id="marker3491-4-6-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-67" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-9"
x="-0.00057633473"
width="1.0011527"
y="-0.0044412325"
height="1.0088825">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-1" />
</filter>
<marker
style="overflow:visible"
id="marker3491-4-6-2-0"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-67-9" />
</marker>
<marker
style="overflow:visible"
id="marker16508-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path16506-9" />
</marker>
<marker
style="overflow:visible"
id="marker16228-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path16226-3" />
</marker>
<marker
style="overflow:visible"
id="marker5173-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path5171-8" />
</marker>
<marker
style="overflow:visible"
id="marker5173-5"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path5171-3" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-89"
x="-0.00082279249"
width="1.0016456"
y="-0.004250412"
height="1.0085008">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-73" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-89-0"
x="-0.00075709657"
width="1.0015142"
y="-0.0058087442"
height="1.0116175">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-73-6" />
</filter>
<marker
style="overflow:visible"
id="marker3723-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3721-0" />
</marker>
<marker
style="overflow:visible"
id="marker3723-8"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3721-9" />
</marker>
<marker
style="overflow:visible"
id="marker4956-6"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-6" />
</marker>
<marker
style="overflow:visible"
id="marker4956-9"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-5" />
</marker>
<marker
style="overflow:visible"
id="marker4956-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-8" />
</marker>
<marker
style="overflow:visible"
id="marker4956-6-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-6-1" />
</marker>
<marker
style="overflow:visible"
id="marker4956-9-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-5-2" />
</marker>
<marker
style="overflow:visible"
id="marker4956-4-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-8-9" />
</marker>
<marker
style="overflow:visible"
id="marker4956-6-7-3"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-6-1-9" />
</marker>
<marker
style="overflow:visible"
id="marker4956-9-7-0"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-5-2-8" />
</marker>
<marker
style="overflow:visible"
id="marker8811-2"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path8809-2" />
</marker>
<marker
style="overflow:visible"
id="marker4956-4-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-8-7" />
</marker>
<marker
style="overflow:visible"
id="marker8811-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path8809-8" />
</marker>
<marker
style="overflow:visible"
id="marker4956-4-7-1"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4954-8-7-2" />
</marker>
<marker
style="overflow:visible"
id="marker3491-4-6-3-4"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path3489-5-1-6-6" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-6-9"
x="-0.010376962"
width="1.0324013"
y="-0.29780814"
height="1.3354836">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-7-4" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0"
x="-0.00026171256"
width="1.0005234"
y="-0.0081200313"
height="1.0162401">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-65"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-2" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-6"
x="-0.00034986248"
width="1.0006997"
y="-0.0081200313"
height="1.0162401">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-5" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-93"
x="-0.0007179879"
width="1.001436"
y="-0.01046951"
height="1.020939">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-9" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-3"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-0" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-1"
x="-0.00030559668"
width="1.0006112"
y="-0.0081200313"
height="1.0162401">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-7" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-99"
x="-0.00021936453"
width="1.0004387"
y="-0.0034140455"
height="1.0068281">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-4" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-35"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-70" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-8"
x="-0.00036070885"
width="1.0007214"
y="-0.0044154119"
height="1.0088308">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-1" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-35-3"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-70-4" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-8-9"
x="-0.00059937308"
width="1.0011987"
y="-0.0028640273"
height="1.0057281">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-1-0" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-35-3-1"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-70-4-2" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-8-9-0"
x="-0.00068401003"
width="1.001368"
y="-0.0047981918"
height="1.0095964">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-1-0-7" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-35-1"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-70-0" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-0-8-1"
x="-0.00035288246"
width="1.0007058"
y="-0.0033793589"
height="1.0067587">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-4-1-3" />
</filter>
<marker
style="overflow:visible"
id="marker13726-1"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path13724-9" />
</marker>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-89-7"
x="-0.00082279249"
width="1.0016456"
y="-0.004250412"
height="1.0085008">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-73-0" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8"
x="-0.00051767967"
width="1.0010354"
y="-0.0028631117"
height="1.0057262">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-32"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-1" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-4"
x="-0.00051767967"
width="1.0010354"
y="-0.0028631117"
height="1.0057262">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-16" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-4"
x="-0.0025883693"
width="1.0051767"
y="-0.012349441"
height="1.0246989">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-41" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-7"
x="-0.00051767967"
width="1.0010354"
y="-0.0028631117"
height="1.0057262">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-9" />
</filter>
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter4875-9-0-1-8-3"
x="-0.00051767967"
width="1.0010354"
y="-0.0028631117"
height="1.0057262">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.0089359747"
id="feGaussianBlur4877-77-2-0-7-0" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="1079.8531"
inkscape:cy="1947.5741"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="1360"
inkscape:window-height="731"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:pagecheckerboard="0"
showguides="false" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<script
id="JessyInk"
ns1:version="1.5.5">// Copyright 2008, 2009 Hannes Hochreiner
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
// Set onload event handler.
window.onload = jessyInkInit;
// Creating a namespace dictionary. The standard Inkscape namespaces are taken from inkex.py.
var NSS = new Object();
NSS['sodipodi']='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd';
NSS['cc']='http://web.resource.org/cc/';
NSS['svg']='http://www.w3.org/2000/svg';
NSS['dc']='http://purl.org/dc/elements/1.1/';
NSS['rdf']='http://www.w3.org/1999/02/22-rdf-syntax-ns#';
NSS['inkscape']='http://www.inkscape.org/namespaces/inkscape';
NSS['xlink']='http://www.w3.org/1999/xlink';
NSS['xml']='http://www.w3.org/XML/1998/namespace';
NSS['jessyink']='https://launchpad.net/jessyink';
// Keycodes.
var LEFT_KEY = 37; // cursor left keycode
var UP_KEY = 38; // cursor up keycode
var RIGHT_KEY = 39; // cursor right keycode
var DOWN_KEY = 40; // cursor down keycode
var PAGE_UP_KEY = 33; // page up keycode
var PAGE_DOWN_KEY = 34; // page down keycode
var HOME_KEY = 36; // home keycode
var END_KEY = 35; // end keycode
var ENTER_KEY = 13; // next slide
var SPACE_KEY = 32;
var ESCAPE_KEY = 27;
// Presentation modes.
var SLIDE_MODE = 1;
var INDEX_MODE = 2;
var DRAWING_MODE = 3;
// Mouse handler actions.
var MOUSE_UP = 1;
var MOUSE_DOWN = 2;
var MOUSE_MOVE = 3;
var MOUSE_WHEEL = 4;
// Parameters.
var ROOT_NODE = document.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;svg&quot;)[0];
var HEIGHT = 0;
var WIDTH = 0;
var INDEX_COLUMNS_DEFAULT = 4;
var INDEX_COLUMNS = INDEX_COLUMNS_DEFAULT;
var INDEX_OFFSET = 0;
var STATE_START = -1;
var STATE_END = -2;
var BACKGROUND_COLOR = null;
var slides = new Array();
// Initialisation.
var currentMode = SLIDE_MODE;
var masterSlide = null;
var activeSlide = 0;
var activeEffect = 0;
var timeStep = 30; // 40 ms equal 25 frames per second.
var lastFrameTime = null;
var processingEffect = false;
var transCounter = 0;
var effectArray = 0;
var defaultTransitionInDict = new Object();
defaultTransitionInDict[&quot;name&quot;] = &quot;appear&quot;;
var defaultTransitionOutDict = new Object();
defaultTransitionOutDict[&quot;name&quot;] = &quot;appear&quot;;
var jessyInkInitialised = false;
// Initialise char and key code dictionaries.
var charCodeDictionary = getDefaultCharCodeDictionary();
var keyCodeDictionary = getDefaultKeyCodeDictionary();
// Initialise mouse handler dictionary.
var mouseHandlerDictionary = getDefaultMouseHandlerDictionary();
var progress_bar_visible = false;
var timer_elapsed = 0;
var timer_start = timer_elapsed;
var timer_duration = 15; // 15 minutes
var history_counter = 0;
var history_original_elements = new Array();
var history_presentation_elements = new Array();
var mouse_original_path = null;
var mouse_presentation_path = null;
var mouse_last_x = -1;
var mouse_last_y = -1;
var mouse_min_dist_sqr = 3 * 3;
var path_colour = &quot;red&quot;;
var path_width_default = 3;
var path_width = path_width_default;
var path_paint_width = path_width;
var number_of_added_slides = 0;
/** Initialisation function.
* The whole presentation is set-up in this function.
*/
function jessyInkInit()
{
// Make sure we only execute this code once. Double execution can occur if the onload event handler is set
// in the main svg tag as well (as was recommended in earlier versions). Executing this function twice does
// not lead to any problems, but it takes more time.
if (jessyInkInitialised)
return;
// Making the presentation scalable.
var VIEWBOX = ROOT_NODE.getAttribute(&quot;viewBox&quot;);
if (VIEWBOX)
{
WIDTH = ROOT_NODE.viewBox.animVal.width;
HEIGHT = ROOT_NODE.viewBox.animVal.height;
}
else
{
HEIGHT = parseFloat(ROOT_NODE.getAttribute(&quot;height&quot;));
WIDTH = parseFloat(ROOT_NODE.getAttribute(&quot;width&quot;));
ROOT_NODE.setAttribute(&quot;viewBox&quot;, &quot;0 0 &quot; + WIDTH + &quot; &quot; + HEIGHT);
}
ROOT_NODE.setAttribute(&quot;width&quot;, &quot;100%&quot;);
ROOT_NODE.setAttribute(&quot;height&quot;, &quot;100%&quot;);
// Setting the background color.
var namedViews = document.getElementsByTagNameNS(NSS[&quot;sodipodi&quot;], &quot;namedview&quot;);
for (var counter = 0; counter &lt; namedViews.length; counter++)
{
if (namedViews[counter].hasAttribute(&quot;id&quot;) &amp;&amp; namedViews[counter].hasAttribute(&quot;pagecolor&quot;))
{
if (namedViews[counter].getAttribute(&quot;id&quot;) == &quot;base&quot;)
{
BACKGROUND_COLOR = namedViews[counter].getAttribute(&quot;pagecolor&quot;);
var newAttribute = &quot;background-color:&quot; + BACKGROUND_COLOR + &quot;;&quot;;
if (ROOT_NODE.hasAttribute(&quot;style&quot;))
newAttribute += ROOT_NODE.getAttribute(&quot;style&quot;);
ROOT_NODE.setAttribute(&quot;style&quot;, newAttribute);
}
}
}
// Defining clip-path.
var defsNodes = document.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;defs&quot;);
if (defsNodes.length &gt; 0)
{
var existingClipPath = document.getElementById(&quot;jessyInkSlideClipPath&quot;);
if (!existingClipPath)
{
var rectNode = document.createElementNS(NSS[&quot;svg&quot;], &quot;rect&quot;);
var clipPath = document.createElementNS(NSS[&quot;svg&quot;], &quot;clipPath&quot;);
rectNode.setAttribute(&quot;x&quot;, 0);
rectNode.setAttribute(&quot;y&quot;, 0);
rectNode.setAttribute(&quot;width&quot;, WIDTH);
rectNode.setAttribute(&quot;height&quot;, HEIGHT);
clipPath.setAttribute(&quot;id&quot;, &quot;jessyInkSlideClipPath&quot;);
clipPath.setAttribute(&quot;clipPathUnits&quot;, &quot;userSpaceOnUse&quot;);
clipPath.appendChild(rectNode);
defsNodes[0].appendChild(clipPath);
}
}
// Making a list of the slide and finding the master slide.
var nodes = document.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;g&quot;);
var tempSlides = new Array();
var existingJessyInkPresentationLayer = null;
for (var counter = 0; counter &lt; nodes.length; counter++)
{
if (nodes[counter].getAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;) &amp;&amp; (nodes[counter].getAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;) == &quot;layer&quot;))
{
if (nodes[counter].getAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;) &amp;&amp; nodes[counter].getAttributeNS(NSS[&quot;jessyink&quot;], &quot;masterSlide&quot;) == &quot;masterSlide&quot;)
masterSlide = nodes[counter];
else if (nodes[counter].getAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;) &amp;&amp; nodes[counter].getAttributeNS(NSS[&quot;jessyink&quot;], &quot;presentationLayer&quot;) == &quot;presentationLayer&quot;)
existingJessyInkPresentationLayer = nodes[counter];
else
tempSlides.push(nodes[counter].getAttribute(&quot;id&quot;));
}
else if (nodes[counter].getAttributeNS(NSS['jessyink'], 'element'))
{
handleElement(nodes[counter]);
}
}
// Hide master slide set default transitions.
if (masterSlide)
{
masterSlide.style.display = &quot;none&quot;;
if (masterSlide.hasAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionIn&quot;))
defaultTransitionInDict = propStrToDict(masterSlide.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionIn&quot;));
if (masterSlide.hasAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionOut&quot;))
defaultTransitionOutDict = propStrToDict(masterSlide.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionOut&quot;));
}
if (existingJessyInkPresentationLayer != null)
{
existingJessyInkPresentationLayer.parentNode.removeChild(existingJessyInkPresentationLayer);
}
// Set start slide.
var hashObj = new LocationHash(window.location.hash);
activeSlide = hashObj.slideNumber;
activeEffect = hashObj.effectNumber;
if (activeSlide &lt; 0)
activeSlide = 0;
else if (activeSlide &gt;= tempSlides.length)
activeSlide = tempSlides.length - 1;
var originalNode = document.getElementById(tempSlides[counter]);
var JessyInkPresentationLayer = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
JessyInkPresentationLayer.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;, &quot;layer&quot;);
JessyInkPresentationLayer.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;, &quot;JessyInk Presentation Layer&quot;);
JessyInkPresentationLayer.setAttributeNS(NSS[&quot;jessyink&quot;], &quot;presentationLayer&quot;, &quot;presentationLayer&quot;);
JessyInkPresentationLayer.setAttribute(&quot;id&quot;, &quot;jessyink_presentation_layer&quot;);
JessyInkPresentationLayer.style.display = &quot;inherit&quot;;
ROOT_NODE.appendChild(JessyInkPresentationLayer);
// Gathering all the information about the transitions and effects of the slides, set the background
// from the master slide and substitute the auto-texts.
for (var counter = 0; counter &lt; tempSlides.length; counter++)
{
var originalNode = document.getElementById(tempSlides[counter]);
originalNode.style.display = &quot;none&quot;;
var node = suffixNodeIds(originalNode.cloneNode(true), &quot;_&quot; + counter);
JessyInkPresentationLayer.appendChild(node);
slides[counter] = new Object();
slides[counter][&quot;original_element&quot;] = originalNode;
slides[counter][&quot;element&quot;] = node;
// Set build in transition.
slides[counter][&quot;transitionIn&quot;] = new Object();
var dict;
if (node.hasAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionIn&quot;))
dict = propStrToDict(node.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionIn&quot;));
else
dict = defaultTransitionInDict;
slides[counter][&quot;transitionIn&quot;][&quot;name&quot;] = dict[&quot;name&quot;];
slides[counter][&quot;transitionIn&quot;][&quot;options&quot;] = new Object();
for (key in dict)
if (key != &quot;name&quot;)
slides[counter][&quot;transitionIn&quot;][&quot;options&quot;][key] = dict[key];
// Set build out transition.
slides[counter][&quot;transitionOut&quot;] = new Object();
if (node.hasAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionOut&quot;))
dict = propStrToDict(node.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;transitionOut&quot;));
else
dict = defaultTransitionOutDict;
slides[counter][&quot;transitionOut&quot;][&quot;name&quot;] = dict[&quot;name&quot;];
slides[counter][&quot;transitionOut&quot;][&quot;options&quot;] = new Object();
for (key in dict)
if (key != &quot;name&quot;)
slides[counter][&quot;transitionOut&quot;][&quot;options&quot;][key] = dict[key];
// Copy master slide content.
if (masterSlide)
{
var clonedNode = suffixNodeIds(masterSlide.cloneNode(true), &quot;_&quot; + counter);
clonedNode.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;);
clonedNode.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;);
clonedNode.style.display = &quot;inherit&quot;;
node.insertBefore(clonedNode, node.firstChild);
}
// Setting clip path.
node.setAttribute(&quot;clip-path&quot;, &quot;url(#jessyInkSlideClipPath)&quot;);
// Substitute auto texts.
substituteAutoTexts(node, node.getAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;), counter + 1, tempSlides.length);
node.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;);
node.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;);
// Set effects.
var tempEffects = new Array();
var groups = new Object();
for (var IOCounter = 0; IOCounter &lt;= 1; IOCounter++)
{
var propName = &quot;&quot;;
var dir = 0;
if (IOCounter == 0)
{
propName = &quot;effectIn&quot;;
dir = 1;
}
else if (IOCounter == 1)
{
propName = &quot;effectOut&quot;;
dir = -1;
}
var effects = getElementsByPropertyNS(node, NSS[&quot;jessyink&quot;], propName);
for (var effectCounter = 0; effectCounter &lt; effects.length; effectCounter++)
{
var element = document.getElementById(effects[effectCounter]);
var dict = propStrToDict(element.getAttributeNS(NSS[&quot;jessyink&quot;], propName));
// Put every element that has an effect associated with it, into its own group.
// Unless of course, we already put it into its own group.
if (!(groups[element.id]))
{
var newGroup = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
element.parentNode.insertBefore(newGroup, element);
newGroup.appendChild(element.parentNode.removeChild(element));
groups[element.id] = newGroup;
}
var effectDict = new Object();
effectDict[&quot;effect&quot;] = dict[&quot;name&quot;];
effectDict[&quot;dir&quot;] = dir;
effectDict[&quot;element&quot;] = groups[element.id];
for (var option in dict)
{
if ((option != &quot;name&quot;) &amp;&amp; (option != &quot;order&quot;))
{
if (!effectDict[&quot;options&quot;])
effectDict[&quot;options&quot;] = new Object();
effectDict[&quot;options&quot;][option] = dict[option];
}
}
if (!tempEffects[dict[&quot;order&quot;]])
tempEffects[dict[&quot;order&quot;]] = new Array();
tempEffects[dict[&quot;order&quot;]][tempEffects[dict[&quot;order&quot;]].length] = effectDict;
}
}
// Make invisible, but keep in rendering tree to ensure that bounding box can be calculated.
node.setAttribute(&quot;opacity&quot;,0);
node.style.display = &quot;inherit&quot;;
// Create a transform group.
var transformGroup = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
// Add content to transform group.
while (node.firstChild)
transformGroup.appendChild(node.firstChild);
// Transfer the transform attribute from the node to the transform group.
if (node.getAttribute(&quot;transform&quot;))
{
transformGroup.setAttribute(&quot;transform&quot;, node.getAttribute(&quot;transform&quot;));
node.removeAttribute(&quot;transform&quot;);
}
// Create a view group.
var viewGroup = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
viewGroup.appendChild(transformGroup);
slides[counter][&quot;viewGroup&quot;] = node.appendChild(viewGroup);
// Insert background.
if (BACKGROUND_COLOR != null)
{
var rectNode = document.createElementNS(NSS[&quot;svg&quot;], &quot;rect&quot;);
rectNode.setAttribute(&quot;x&quot;, 0);
rectNode.setAttribute(&quot;y&quot;, 0);
rectNode.setAttribute(&quot;width&quot;, WIDTH);
rectNode.setAttribute(&quot;height&quot;, HEIGHT);
rectNode.setAttribute(&quot;id&quot;, &quot;jessyInkBackground&quot; + counter);
rectNode.setAttribute(&quot;fill&quot;, BACKGROUND_COLOR);
slides[counter][&quot;viewGroup&quot;].insertBefore(rectNode, slides[counter][&quot;viewGroup&quot;].firstChild);
}
// Set views.
var tempViews = new Array();
var views = getElementsByPropertyNS(node, NSS[&quot;jessyink&quot;], &quot;view&quot;);
var matrixOld = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
// Set initial view even if there are no other views.
slides[counter][&quot;viewGroup&quot;].setAttribute(&quot;transform&quot;, matrixOld.toAttribute());
slides[counter].initialView = matrixOld.toAttribute();
for (var viewCounter = 0; viewCounter &lt; views.length; viewCounter++)
{
var element = document.getElementById(views[viewCounter]);
var dict = propStrToDict(element.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;view&quot;));
if (dict[&quot;order&quot;] == 0)
{
matrixOld = pointMatrixToTransformation(rectToMatrix(element)).mult((new matrixSVG()).fromSVGMatrix(slides[counter].viewGroup.getScreenCTM()).inv().mult((new matrixSVG()).fromSVGMatrix(element.parentNode.getScreenCTM())).inv());
slides[counter].initialView = matrixOld.toAttribute();
}
else
{
var effectDict = new Object();
effectDict[&quot;effect&quot;] = dict[&quot;name&quot;];
effectDict[&quot;dir&quot;] = 1;
effectDict[&quot;element&quot;] = slides[counter][&quot;viewGroup&quot;];
effectDict[&quot;order&quot;] = dict[&quot;order&quot;];
for (var option in dict)
{
if ((option != &quot;name&quot;) &amp;&amp; (option != &quot;order&quot;))
{
if (!effectDict[&quot;options&quot;])
effectDict[&quot;options&quot;] = new Object();
effectDict[&quot;options&quot;][option] = dict[option];
}
}
effectDict[&quot;options&quot;][&quot;matrixNew&quot;] = pointMatrixToTransformation(rectToMatrix(element)).mult((new matrixSVG()).fromSVGMatrix(slides[counter].viewGroup.getScreenCTM()).inv().mult((new matrixSVG()).fromSVGMatrix(element.parentNode.getScreenCTM())).inv());
tempViews[dict[&quot;order&quot;]] = effectDict;
}
// Remove element.
element.parentNode.removeChild(element);
}
// Consolidate view array and append it to the effect array.
if (tempViews.length &gt; 0)
{
for (var viewCounter = 0; viewCounter &lt; tempViews.length; viewCounter++)
{
if (tempViews[viewCounter])
{
tempViews[viewCounter][&quot;options&quot;][&quot;matrixOld&quot;] = matrixOld;
matrixOld = tempViews[viewCounter][&quot;options&quot;][&quot;matrixNew&quot;];
if (!tempEffects[tempViews[viewCounter][&quot;order&quot;]])
tempEffects[tempViews[viewCounter][&quot;order&quot;]] = new Array();
tempEffects[tempViews[viewCounter][&quot;order&quot;]][tempEffects[tempViews[viewCounter][&quot;order&quot;]].length] = tempViews[viewCounter];
}
}
}
// Set consolidated effect array.
if (tempEffects.length &gt; 0)
{
slides[counter][&quot;effects&quot;] = new Array();
for (var effectCounter = 0; effectCounter &lt; tempEffects.length; effectCounter++)
{
if (tempEffects[effectCounter])
slides[counter][&quot;effects&quot;][slides[counter][&quot;effects&quot;].length] = tempEffects[effectCounter];
}
}
node.setAttribute(&quot;onmouseover&quot;, &quot;if ((currentMode == INDEX_MODE) &amp;&amp; ( activeSlide != &quot; + counter + &quot;)) { indexSetActiveSlide(&quot; + counter + &quot;); };&quot;);
// Set visibility for initial state.
if (counter == activeSlide)
{
node.style.display = &quot;inherit&quot;;
node.setAttribute(&quot;opacity&quot;,1);
}
else
{
node.style.display = &quot;none&quot;;
node.setAttribute(&quot;opacity&quot;,0);
}
}
// Set key handler.
var jessyInkObjects = document.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;g&quot;);
for (var counter = 0; counter &lt; jessyInkObjects.length; counter++)
{
var elem = jessyInkObjects[counter];
if (elem.getAttributeNS(NSS[&quot;jessyink&quot;], &quot;customKeyBindings&quot;))
{
if (elem.getCustomKeyBindings != undefined)
keyCodeDictionary = elem.getCustomKeyBindings();
if (elem.getCustomCharBindings != undefined)
charCodeDictionary = elem.getCustomCharBindings();
}
}
// Set mouse handler.
var jessyInkMouseHandler = document.getElementsByTagNameNS(NSS[&quot;jessyink&quot;], &quot;mousehandler&quot;);
for (var counter = 0; counter &lt; jessyInkMouseHandler.length; counter++)
{
var elem = jessyInkMouseHandler[counter];
if (elem.getMouseHandler != undefined)
{
var tempDict = elem.getMouseHandler();
for (mode in tempDict)
{
if (!mouseHandlerDictionary[mode])
mouseHandlerDictionary[mode] = new Object();
for (handler in tempDict[mode])
mouseHandlerDictionary[mode][handler] = tempDict[mode][handler];
}
}
}
// Check effect number.
if ((activeEffect &lt; 0) || (!slides[activeSlide].effects))
{
activeEffect = 0;
}
else if (activeEffect &gt; slides[activeSlide].effects.length)
{
activeEffect = slides[activeSlide].effects.length;
}
createProgressBar(JessyInkPresentationLayer);
hideProgressBar();
setProgressBarValue(activeSlide);
setTimeIndicatorValue(0);
setInterval(&quot;updateTimer()&quot;, 1000);
setSlideToState(activeSlide, activeEffect);
jessyInkInitialised = true;
}
/** Function to substitute the auto-texts.
*
* @param node the node
* @param slideName name of the slide the node is on
* @param slideNumber number of the slide the node is on
* @param numberOfSlides number of slides in the presentation
*/
function substituteAutoTexts(node, slideName, slideNumber, numberOfSlides)
{
var texts = node.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;tspan&quot;);
for (var textCounter = 0; textCounter &lt; texts.length; textCounter++)
{
if (texts[textCounter].getAttributeNS(NSS[&quot;jessyink&quot;], &quot;autoText&quot;) == &quot;slideNumber&quot;)
texts[textCounter].firstChild.nodeValue = slideNumber;
else if (texts[textCounter].getAttributeNS(NSS[&quot;jessyink&quot;], &quot;autoText&quot;) == &quot;numberOfSlides&quot;)
texts[textCounter].firstChild.nodeValue = numberOfSlides;
else if (texts[textCounter].getAttributeNS(NSS[&quot;jessyink&quot;], &quot;autoText&quot;) == &quot;slideTitle&quot;)
texts[textCounter].firstChild.nodeValue = slideName;
}
}
/** Convenience function to get an element depending on whether it has a property with a particular name.
* This function emulates some dearly missed XPath functionality.
*
* @param node the node
* @param namespace namespace of the attribute
* @param name attribute name
*/
function getElementsByPropertyNS(node, namespace, name)
{
var elems = new Array();
if (node.getAttributeNS(namespace, name))
elems.push(node.getAttribute(&quot;id&quot;));
for (var counter = 0; counter &lt; node.childNodes.length; counter++)
{
if (node.childNodes[counter].nodeType == 1)
elems = elems.concat(getElementsByPropertyNS(node.childNodes[counter], namespace, name));
}
return elems;
}
/** Function to dispatch the next effect, if there is none left, change the slide.
*
* @param dir direction of the change (1 = forwards, -1 = backwards)
*/
function dispatchEffects(dir)
{
if (slides[activeSlide][&quot;effects&quot;] &amp;&amp; (((dir == 1) &amp;&amp; (activeEffect &lt; slides[activeSlide][&quot;effects&quot;].length)) || ((dir == -1) &amp;&amp; (activeEffect &gt; 0))))
{
processingEffect = true;
if (dir == 1)
{
effectArray = slides[activeSlide][&quot;effects&quot;][activeEffect];
activeEffect += dir;
}
else if (dir == -1)
{
activeEffect += dir;
effectArray = slides[activeSlide][&quot;effects&quot;][activeEffect];
}
transCounter = 0;
startTime = (new Date()).getTime();
lastFrameTime = null;
effect(dir);
}
else if (((dir == 1) &amp;&amp; (activeSlide &lt; (slides.length - 1))) || (((dir == -1) &amp;&amp; (activeSlide &gt; 0))))
{
changeSlide(dir);
}
}
/** Function to skip effects and directly either put the slide into start or end state or change slides.
*
* @param dir direction of the change (1 = forwards, -1 = backwards)
*/
function skipEffects(dir)
{
if (slides[activeSlide][&quot;effects&quot;] &amp;&amp; (((dir == 1) &amp;&amp; (activeEffect &lt; slides[activeSlide][&quot;effects&quot;].length)) || ((dir == -1) &amp;&amp; (activeEffect &gt; 0))))
{
processingEffect = true;
if (slides[activeSlide][&quot;effects&quot;] &amp;&amp; (dir == 1))
activeEffect = slides[activeSlide][&quot;effects&quot;].length;
else
activeEffect = 0;
if (dir == 1)
setSlideToState(activeSlide, STATE_END);
else
setSlideToState(activeSlide, STATE_START);
processingEffect = false;
}
else if (((dir == 1) &amp;&amp; (activeSlide &lt; (slides.length - 1))) || (((dir == -1) &amp;&amp; (activeSlide &gt; 0))))
{
changeSlide(dir);
}
}
/** Function to change between slides.
*
* @param dir direction (1 = forwards, -1 = backwards)
*/
function changeSlide(dir)
{
processingEffect = true;
effectArray = new Array();
effectArray[0] = new Object();
if (dir == 1)
{
effectArray[0][&quot;effect&quot;] = slides[activeSlide][&quot;transitionOut&quot;][&quot;name&quot;];
effectArray[0][&quot;options&quot;] = slides[activeSlide][&quot;transitionOut&quot;][&quot;options&quot;];
effectArray[0][&quot;dir&quot;] = -1;
}
else if (dir == -1)
{
effectArray[0][&quot;effect&quot;] = slides[activeSlide][&quot;transitionIn&quot;][&quot;name&quot;];
effectArray[0][&quot;options&quot;] = slides[activeSlide][&quot;transitionIn&quot;][&quot;options&quot;];
effectArray[0][&quot;dir&quot;] = 1;
}
effectArray[0][&quot;element&quot;] = slides[activeSlide][&quot;element&quot;];
activeSlide += dir;
setProgressBarValue(activeSlide);
effectArray[1] = new Object();
if (dir == 1)
{
effectArray[1][&quot;effect&quot;] = slides[activeSlide][&quot;transitionIn&quot;][&quot;name&quot;];
effectArray[1][&quot;options&quot;] = slides[activeSlide][&quot;transitionIn&quot;][&quot;options&quot;];
effectArray[1][&quot;dir&quot;] = 1;
}
else if (dir == -1)
{
effectArray[1][&quot;effect&quot;] = slides[activeSlide][&quot;transitionOut&quot;][&quot;name&quot;];
effectArray[1][&quot;options&quot;] = slides[activeSlide][&quot;transitionOut&quot;][&quot;options&quot;];
effectArray[1][&quot;dir&quot;] = -1;
}
effectArray[1][&quot;element&quot;] = slides[activeSlide][&quot;element&quot;];
if (slides[activeSlide][&quot;effects&quot;] &amp;&amp; (dir == -1))
activeEffect = slides[activeSlide][&quot;effects&quot;].length;
else
activeEffect = 0;
if (dir == -1)
setSlideToState(activeSlide, STATE_END);
else
setSlideToState(activeSlide, STATE_START);
transCounter = 0;
startTime = (new Date()).getTime();
lastFrameTime = null;
effect(dir);
}
/** Function to toggle between index and slide mode.
*/
function toggleSlideIndex()
{
var suspendHandle = ROOT_NODE.suspendRedraw(500);
if (currentMode == SLIDE_MODE)
{
hideProgressBar();
INDEX_OFFSET = -1;
indexSetPageSlide(activeSlide);
currentMode = INDEX_MODE;
}
else if (currentMode == INDEX_MODE)
{
for (var counter = 0; counter &lt; slides.length; counter++)
{
slides[counter][&quot;element&quot;].setAttribute(&quot;transform&quot;,&quot;scale(1)&quot;);
if (counter == activeSlide)
{
slides[counter][&quot;element&quot;].style.display = &quot;inherit&quot;;
slides[counter][&quot;element&quot;].setAttribute(&quot;opacity&quot;,1);
activeEffect = 0;
}
else
{
slides[counter][&quot;element&quot;].setAttribute(&quot;opacity&quot;,0);
slides[counter][&quot;element&quot;].style.display = &quot;none&quot;;
}
}
currentMode = SLIDE_MODE;
setSlideToState(activeSlide, STATE_START);
setProgressBarValue(activeSlide);
if (progress_bar_visible)
{
showProgressBar();
}
}
ROOT_NODE.unsuspendRedraw(suspendHandle);
ROOT_NODE.forceRedraw();
}
/** Function to run an effect.
*
* @param dir direction in which to play the effect (1 = forwards, -1 = backwards)
*/
function effect(dir)
{
var done = true;
var suspendHandle = ROOT_NODE.suspendRedraw(200);
for (var counter = 0; counter &lt; effectArray.length; counter++)
{
if (effectArray[counter][&quot;effect&quot;] == &quot;fade&quot;)
done &amp;= fade(parseInt(effectArray[counter][&quot;dir&quot;]) * dir, effectArray[counter][&quot;element&quot;], transCounter, effectArray[counter][&quot;options&quot;]);
else if (effectArray[counter][&quot;effect&quot;] == &quot;appear&quot;)
done &amp;= appear(parseInt(effectArray[counter][&quot;dir&quot;]) * dir, effectArray[counter][&quot;element&quot;], transCounter, effectArray[counter][&quot;options&quot;]);
else if (effectArray[counter][&quot;effect&quot;] == &quot;pop&quot;)
done &amp;= pop(parseInt(effectArray[counter][&quot;dir&quot;]) * dir, effectArray[counter][&quot;element&quot;], transCounter, effectArray[counter][&quot;options&quot;]);
else if (effectArray[counter][&quot;effect&quot;] == &quot;view&quot;)
done &amp;= view(parseInt(effectArray[counter][&quot;dir&quot;]) * dir, effectArray[counter][&quot;element&quot;], transCounter, effectArray[counter][&quot;options&quot;]);
}
ROOT_NODE.unsuspendRedraw(suspendHandle);
ROOT_NODE.forceRedraw();
if (!done)
{
var currentTime = (new Date()).getTime();
var timeDiff = 1;
transCounter = currentTime - startTime;
if (lastFrameTime != null)
{
timeDiff = timeStep - (currentTime - lastFrameTime);
if (timeDiff &lt;= 0)
timeDiff = 1;
}
lastFrameTime = currentTime;
window.setTimeout(&quot;effect(&quot; + dir + &quot;)&quot;, timeDiff);
}
else
{
window.location.hash = (activeSlide + 1) + '_' + activeEffect;
processingEffect = false;
}
}
/** Function to display the index sheet.
*
* @param offsetNumber offset number
*/
function displayIndex(offsetNumber)
{
var offsetX = 0;
var offsetY = 0;
if (offsetNumber &lt; 0)
offsetNumber = 0;
else if (offsetNumber &gt;= slides.length)
offsetNumber = slides.length - 1;
for (var counter = 0; counter &lt; slides.length; counter++)
{
if ((counter &lt; offsetNumber) || (counter &gt; offsetNumber + INDEX_COLUMNS * INDEX_COLUMNS - 1))
{
slides[counter][&quot;element&quot;].setAttribute(&quot;opacity&quot;,0);
slides[counter][&quot;element&quot;].style.display = &quot;none&quot;;
}
else
{
offsetX = ((counter - offsetNumber) % INDEX_COLUMNS) * WIDTH;
offsetY = Math.floor((counter - offsetNumber) / INDEX_COLUMNS) * HEIGHT;
slides[counter][&quot;element&quot;].setAttribute(&quot;transform&quot;,&quot;scale(&quot;+1/INDEX_COLUMNS+&quot;) translate(&quot;+offsetX+&quot;,&quot;+offsetY+&quot;)&quot;);
slides[counter][&quot;element&quot;].style.display = &quot;inherit&quot;;
slides[counter][&quot;element&quot;].setAttribute(&quot;opacity&quot;,0.5);
}
setSlideToState(counter, STATE_END);
}
//do we need to save the current offset?
if (INDEX_OFFSET != offsetNumber)
INDEX_OFFSET = offsetNumber;
}
/** Function to set the active slide in the slide view.
*
* @param nbr index of the active slide
*/
function slideSetActiveSlide(nbr)
{
if (nbr &gt;= slides.length)
nbr = slides.length - 1;
else if (nbr &lt; 0)
nbr = 0;
slides[activeSlide][&quot;element&quot;].setAttribute(&quot;opacity&quot;,0);
slides[activeSlide][&quot;element&quot;].style.display = &quot;none&quot;;
activeSlide = parseInt(nbr);
setSlideToState(activeSlide, STATE_START);
slides[activeSlide][&quot;element&quot;].style.display = &quot;inherit&quot;;
slides[activeSlide][&quot;element&quot;].setAttribute(&quot;opacity&quot;,1);
activeEffect = 0;
setProgressBarValue(nbr);
}
/** Function to set the active slide in the index view.
*
* @param nbr index of the active slide
*/
function indexSetActiveSlide(nbr)
{
if (nbr &gt;= slides.length)
nbr = slides.length - 1;
else if (nbr &lt; 0)
nbr = 0;
slides[activeSlide][&quot;element&quot;].setAttribute(&quot;opacity&quot;,0.5);
activeSlide = parseInt(nbr);
window.location.hash = (activeSlide + 1) + '_0';
slides[activeSlide][&quot;element&quot;].setAttribute(&quot;opacity&quot;,1);
}
/** Function to set the page and active slide in index view.
*
* @param nbr index of the active slide
*
* NOTE: To force a redraw,
* set INDEX_OFFSET to -1 before calling indexSetPageSlide().
*
* This is necessary for zooming (otherwise the index might not
* get redrawn) and when switching to index mode.
*
* INDEX_OFFSET = -1
* indexSetPageSlide(activeSlide);
*/
function indexSetPageSlide(nbr)
{
if (nbr &gt;= slides.length)
nbr = slides.length - 1;
else if (nbr &lt; 0)
nbr = 0;
//calculate the offset
var offset = nbr - nbr % (INDEX_COLUMNS * INDEX_COLUMNS);
if (offset &lt; 0)
offset = 0;
//if different from kept offset, then record and change the page
if (offset != INDEX_OFFSET)
{
INDEX_OFFSET = offset;
displayIndex(INDEX_OFFSET);
}
//set the active slide
indexSetActiveSlide(nbr);
}
/** Event handler for key press.
*
* @param e the event
*/
function keydown(e)
{
if (!e)
e = window.event;
code = e.keyCode || e.charCode;
if (!processingEffect &amp;&amp; keyCodeDictionary[currentMode] &amp;&amp; keyCodeDictionary[currentMode][code])
return keyCodeDictionary[currentMode][code]();
else
document.onkeypress = keypress;
}
// Set event handler for key down.
document.onkeydown = keydown;
/** Event handler for key press.
*
* @param e the event
*/
function keypress(e)
{
document.onkeypress = null;
if (!e)
e = window.event;
str = String.fromCharCode(e.keyCode || e.charCode);
if (!processingEffect &amp;&amp; charCodeDictionary[currentMode] &amp;&amp; charCodeDictionary[currentMode][str])
return charCodeDictionary[currentMode][str]();
}
/** Function to supply the default char code dictionary.
*
* @returns default char code dictionary
*/
function getDefaultCharCodeDictionary()
{
var charCodeDict = new Object();
charCodeDict[SLIDE_MODE] = new Object();
charCodeDict[INDEX_MODE] = new Object();
charCodeDict[DRAWING_MODE] = new Object();
charCodeDict[SLIDE_MODE][&quot;i&quot;] = function () { return toggleSlideIndex(); };
charCodeDict[SLIDE_MODE][&quot;d&quot;] = function () { return slideSwitchToDrawingMode(); };
charCodeDict[SLIDE_MODE][&quot;D&quot;] = function () { return slideQueryDuration(); };
charCodeDict[SLIDE_MODE][&quot;n&quot;] = function () { return slideAddSlide(activeSlide); };
charCodeDict[SLIDE_MODE][&quot;p&quot;] = function () { return slideToggleProgressBarVisibility(); };
charCodeDict[SLIDE_MODE][&quot;t&quot;] = function () { return slideResetTimer(); };
charCodeDict[SLIDE_MODE][&quot;e&quot;] = function () { return slideUpdateExportLayer(); };
charCodeDict[DRAWING_MODE][&quot;d&quot;] = function () { return drawingSwitchToSlideMode(); };
charCodeDict[DRAWING_MODE][&quot;0&quot;] = function () { return drawingResetPathWidth(); };
charCodeDict[DRAWING_MODE][&quot;1&quot;] = function () { return drawingSetPathWidth(1.0); };
charCodeDict[DRAWING_MODE][&quot;3&quot;] = function () { return drawingSetPathWidth(3.0); };
charCodeDict[DRAWING_MODE][&quot;5&quot;] = function () { return drawingSetPathWidth(5.0); };
charCodeDict[DRAWING_MODE][&quot;7&quot;] = function () { return drawingSetPathWidth(7.0); };
charCodeDict[DRAWING_MODE][&quot;9&quot;] = function () { return drawingSetPathWidth(9.0); };
charCodeDict[DRAWING_MODE][&quot;b&quot;] = function () { return drawingSetPathColour(&quot;blue&quot;); };
charCodeDict[DRAWING_MODE][&quot;c&quot;] = function () { return drawingSetPathColour(&quot;cyan&quot;); };
charCodeDict[DRAWING_MODE][&quot;g&quot;] = function () { return drawingSetPathColour(&quot;green&quot;); };
charCodeDict[DRAWING_MODE][&quot;k&quot;] = function () { return drawingSetPathColour(&quot;black&quot;); };
charCodeDict[DRAWING_MODE][&quot;m&quot;] = function () { return drawingSetPathColour(&quot;magenta&quot;); };
charCodeDict[DRAWING_MODE][&quot;o&quot;] = function () { return drawingSetPathColour(&quot;orange&quot;); };
charCodeDict[DRAWING_MODE][&quot;r&quot;] = function () { return drawingSetPathColour(&quot;red&quot;); };
charCodeDict[DRAWING_MODE][&quot;w&quot;] = function () { return drawingSetPathColour(&quot;white&quot;); };
charCodeDict[DRAWING_MODE][&quot;y&quot;] = function () { return drawingSetPathColour(&quot;yellow&quot;); };
charCodeDict[DRAWING_MODE][&quot;z&quot;] = function () { return drawingUndo(); };
charCodeDict[INDEX_MODE][&quot;i&quot;] = function () { return toggleSlideIndex(); };
charCodeDict[INDEX_MODE][&quot;-&quot;] = function () { return indexDecreaseNumberOfColumns(); };
charCodeDict[INDEX_MODE][&quot;=&quot;] = function () { return indexIncreaseNumberOfColumns(); };
charCodeDict[INDEX_MODE][&quot;+&quot;] = function () { return indexIncreaseNumberOfColumns(); };
charCodeDict[INDEX_MODE][&quot;0&quot;] = function () { return indexResetNumberOfColumns(); };
return charCodeDict;
}
/** Function to supply the default key code dictionary.
*
* @returns default key code dictionary
*/
function getDefaultKeyCodeDictionary()
{
var keyCodeDict = new Object();
keyCodeDict[SLIDE_MODE] = new Object();
keyCodeDict[INDEX_MODE] = new Object();
keyCodeDict[DRAWING_MODE] = new Object();
keyCodeDict[SLIDE_MODE][LEFT_KEY] = function() { return dispatchEffects(-1); };
keyCodeDict[SLIDE_MODE][RIGHT_KEY] = function() { return dispatchEffects(1); };
keyCodeDict[SLIDE_MODE][UP_KEY] = function() { return skipEffects(-1); };
keyCodeDict[SLIDE_MODE][DOWN_KEY] = function() { return skipEffects(1); };
keyCodeDict[SLIDE_MODE][PAGE_UP_KEY] = function() { return dispatchEffects(-1); };
keyCodeDict[SLIDE_MODE][PAGE_DOWN_KEY] = function() { return dispatchEffects(1); };
keyCodeDict[SLIDE_MODE][HOME_KEY] = function() { return slideSetActiveSlide(0); };
keyCodeDict[SLIDE_MODE][END_KEY] = function() { return slideSetActiveSlide(slides.length - 1); };
keyCodeDict[SLIDE_MODE][SPACE_KEY] = function() { return dispatchEffects(1); };
keyCodeDict[INDEX_MODE][LEFT_KEY] = function() { return indexSetPageSlide(activeSlide - 1); };
keyCodeDict[INDEX_MODE][RIGHT_KEY] = function() { return indexSetPageSlide(activeSlide + 1); };
keyCodeDict[INDEX_MODE][UP_KEY] = function() { return indexSetPageSlide(activeSlide - INDEX_COLUMNS); };
keyCodeDict[INDEX_MODE][DOWN_KEY] = function() { return indexSetPageSlide(activeSlide + INDEX_COLUMNS); };
keyCodeDict[INDEX_MODE][PAGE_UP_KEY] = function() { return indexSetPageSlide(activeSlide - INDEX_COLUMNS * INDEX_COLUMNS); };
keyCodeDict[INDEX_MODE][PAGE_DOWN_KEY] = function() { return indexSetPageSlide(activeSlide + INDEX_COLUMNS * INDEX_COLUMNS); };
keyCodeDict[INDEX_MODE][HOME_KEY] = function() { return indexSetPageSlide(0); };
keyCodeDict[INDEX_MODE][END_KEY] = function() { return indexSetPageSlide(slides.length - 1); };
keyCodeDict[INDEX_MODE][ENTER_KEY] = function() { return toggleSlideIndex(); };
keyCodeDict[DRAWING_MODE][ESCAPE_KEY] = function () { return drawingSwitchToSlideMode(); };
return keyCodeDict;
}
/** Function to handle all mouse events.
*
* @param evnt event
* @param action type of event (e.g. mouse up, mouse wheel)
*/
function mouseHandlerDispatch(evnt, action)
{
if (!evnt)
evnt = window.event;
var retVal = true;
if (!processingEffect &amp;&amp; mouseHandlerDictionary[currentMode] &amp;&amp; mouseHandlerDictionary[currentMode][action])
{
var subRetVal = mouseHandlerDictionary[currentMode][action](evnt);
if (subRetVal != null &amp;&amp; subRetVal != undefined)
retVal = subRetVal;
}
if (evnt.preventDefault &amp;&amp; !retVal)
evnt.preventDefault();
evnt.returnValue = retVal;
return retVal;
}
// Set mouse event handler.
document.onmousedown = function(e) { return mouseHandlerDispatch(e, MOUSE_DOWN); };
document.onmouseup = function(e) { return mouseHandlerDispatch(e, MOUSE_UP); };
document.onmousemove = function(e) { return mouseHandlerDispatch(e, MOUSE_MOVE); };
// Moz
if (window.addEventListener)
{
window.addEventListener('DOMMouseScroll', function(e) { return mouseHandlerDispatch(e, MOUSE_WHEEL); }, false);
}
// Opera Safari OK - may not work in IE
window.onmousewheel = function(e) { return mouseHandlerDispatch(e, MOUSE_WHEEL); };
/** Function to supply the default mouse handler dictionary.
*
* @returns default mouse handler dictionary
*/
function getDefaultMouseHandlerDictionary()
{
var mouseHandlerDict = new Object();
mouseHandlerDict[SLIDE_MODE] = new Object();
mouseHandlerDict[INDEX_MODE] = new Object();
mouseHandlerDict[DRAWING_MODE] = new Object();
mouseHandlerDict[SLIDE_MODE][MOUSE_DOWN] = function(evnt) { return dispatchEffects(1); };
mouseHandlerDict[SLIDE_MODE][MOUSE_WHEEL] = function(evnt) { return slideMousewheel(evnt); };
mouseHandlerDict[INDEX_MODE][MOUSE_DOWN] = function(evnt) { return toggleSlideIndex(); };
mouseHandlerDict[DRAWING_MODE][MOUSE_DOWN] = function(evnt) { return drawingMousedown(evnt); };
mouseHandlerDict[DRAWING_MODE][MOUSE_UP] = function(evnt) { return drawingMouseup(evnt); };
mouseHandlerDict[DRAWING_MODE][MOUSE_MOVE] = function(evnt) { return drawingMousemove(evnt); };
return mouseHandlerDict;
}
/** Function to switch from slide mode to drawing mode.
*/
function slideSwitchToDrawingMode()
{
currentMode = DRAWING_MODE;
var tempDict;
if (ROOT_NODE.hasAttribute(&quot;style&quot;))
tempDict = propStrToDict(ROOT_NODE.getAttribute(&quot;style&quot;));
else
tempDict = new Object();
tempDict[&quot;cursor&quot;] = &quot;crosshair&quot;;
ROOT_NODE.setAttribute(&quot;style&quot;, dictToPropStr(tempDict));
}
/** Function to switch from drawing mode to slide mode.
*/
function drawingSwitchToSlideMode()
{
currentMode = SLIDE_MODE;
var tempDict;
if (ROOT_NODE.hasAttribute(&quot;style&quot;))
tempDict = propStrToDict(ROOT_NODE.getAttribute(&quot;style&quot;));
else
tempDict = new Object();
tempDict[&quot;cursor&quot;] = &quot;auto&quot;;
ROOT_NODE.setAttribute(&quot;style&quot;, dictToPropStr(tempDict));
}
/** Function to decrease the number of columns in index mode.
*/
function indexDecreaseNumberOfColumns()
{
if (INDEX_COLUMNS &gt;= 3)
{
INDEX_COLUMNS -= 1;
INDEX_OFFSET = -1
indexSetPageSlide(activeSlide);
}
}
/** Function to increase the number of columns in index mode.
*/
function indexIncreaseNumberOfColumns()
{
if (INDEX_COLUMNS &lt; 7)
{
INDEX_COLUMNS += 1;
INDEX_OFFSET = -1
indexSetPageSlide(activeSlide);
}
}
/** Function to reset the number of columns in index mode.
*/
function indexResetNumberOfColumns()
{
if (INDEX_COLUMNS != INDEX_COLUMNS_DEFAULT)
{
INDEX_COLUMNS = INDEX_COLUMNS_DEFAULT;
INDEX_OFFSET = -1
indexSetPageSlide(activeSlide);
}
}
/** Function to reset path width in drawing mode.
*/
function drawingResetPathWidth()
{
path_width = path_width_default;
set_path_paint_width();
}
/** Function to set path width in drawing mode.
*
* @param width new path width
*/
function drawingSetPathWidth(width)
{
path_width = width;
set_path_paint_width();
}
/** Function to set path colour in drawing mode.
*
* @param colour new path colour
*/
function drawingSetPathColour(colour)
{
path_colour = colour;
}
/** Function to query the duration of the presentation from the user in slide mode.
*/
function slideQueryDuration()
{
var new_duration = prompt(&quot;Length of presentation in minutes?&quot;, timer_duration);
if ((new_duration != null) &amp;&amp; (new_duration != ''))
{
timer_duration = new_duration;
}
updateTimer();
}
/** Function to add new slide in slide mode.
*
* @param afterSlide after which slide to insert the new one
*/
function slideAddSlide(afterSlide)
{
addSlide(afterSlide);
slideSetActiveSlide(afterSlide + 1);
updateTimer();
}
/** Function to toggle the visibility of the progress bar in slide mode.
*/
function slideToggleProgressBarVisibility()
{
if (progress_bar_visible)
{
progress_bar_visible = false;
hideProgressBar();
}
else
{
progress_bar_visible = true;
showProgressBar();
}
}
/** Function to reset the timer in slide mode.
*/
function slideResetTimer()
{
timer_start = timer_elapsed;
updateTimer();
}
/** Convenience function to pad a string with zero in front up to a certain length.
*/
function padString(str, len)
{
var outStr = str;
while (outStr.length &lt; len)
{
outStr = '0' + outStr;
}
return outStr;
}
/** Function to update the export layer.
*/
function slideUpdateExportLayer()
{
// Suspend redraw since we are going to mess with the slides.
var suspendHandle = ROOT_NODE.suspendRedraw(2000);
var tmpActiveSlide = activeSlide;
var tmpActiveEffect = activeEffect;
var exportedLayers = new Array();
for (var counterSlides = 0; counterSlides &lt; slides.length; counterSlides++)
{
var exportNode;
setSlideToState(counterSlides, STATE_START);
var maxEffect = 0;
if (slides[counterSlides].effects)
{
maxEffect = slides[counterSlides].effects.length;
}
exportNode = slides[counterSlides].element.cloneNode(true);
exportNode.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;, &quot;layer&quot;);
exportNode.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;, &quot;slide_&quot; + padString((counterSlides + 1).toString(), slides.length.toString().length) + &quot;_effect_&quot; + padString(&quot;0&quot;, maxEffect.toString().length));
exportedLayers.push(exportNode);
if (slides[counterSlides][&quot;effects&quot;])
{
for (var counter = 0; counter &lt; slides[counterSlides][&quot;effects&quot;].length; counter++)
{
for (var subCounter = 0; subCounter &lt; slides[counterSlides][&quot;effects&quot;][counter].length; subCounter++)
{
var effect = slides[counterSlides][&quot;effects&quot;][counter][subCounter];
if (effect[&quot;effect&quot;] == &quot;fade&quot;)
fade(parseInt(effect[&quot;dir&quot;]), effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;appear&quot;)
appear(parseInt(effect[&quot;dir&quot;]), effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;pop&quot;)
pop(parseInt(effect[&quot;dir&quot;]), effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;view&quot;)
view(parseInt(effect[&quot;dir&quot;]), effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
}
var layerName = &quot;slide_&quot; + padString((counterSlides + 1).toString(), slides.length.toString().length) + &quot;_effect_&quot; + padString((counter + 1).toString(), maxEffect.toString().length);
exportNode = slides[counterSlides].element.cloneNode(true);
exportNode.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;, &quot;layer&quot;);
exportNode.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;, layerName);
exportNode.setAttribute(&quot;id&quot;, layerName);
exportedLayers.push(exportNode);
}
}
}
activeSlide = tmpActiveSlide;
activeEffect = tmpActiveEffect;
setSlideToState(activeSlide, activeEffect);
// Copy image.
var newDoc = document.documentElement.cloneNode(true);
// Delete viewbox form new imag and set width and height.
newDoc.removeAttribute('viewbox');
newDoc.setAttribute('width', WIDTH);
newDoc.setAttribute('height', HEIGHT);
// Delete all layers and script elements.
var nodesToBeRemoved = new Array();
for (var childCounter = 0; childCounter &lt; newDoc.childNodes.length; childCounter++)
{
var child = newDoc.childNodes[childCounter];
if (child.nodeType == 1)
{
if ((child.nodeName.toUpperCase() == 'G') || (child.nodeName.toUpperCase() == 'SCRIPT'))
{
nodesToBeRemoved.push(child);
}
}
}
for (var ndCounter = 0; ndCounter &lt; nodesToBeRemoved.length; ndCounter++)
{
var nd = nodesToBeRemoved[ndCounter];
// Before removing the node, check whether it contains any definitions.
var defs = nd.getElementsByTagNameNS(NSS[&quot;svg&quot;], &quot;defs&quot;);
for (var defsCounter = 0; defsCounter &lt; defs.length; defsCounter++)
{
if (defs[defsCounter].id)
{
newDoc.appendChild(defs[defsCounter].cloneNode(true));
}
}
// Remove node.
nd.parentNode.removeChild(nd);
}
// Set current layer.
if (exportedLayers[0])
{
var namedView;
for (var nodeCounter = 0; nodeCounter &lt; newDoc.childNodes.length; nodeCounter++)
{
if ((newDoc.childNodes[nodeCounter].nodeType == 1) &amp;&amp; (newDoc.childNodes[nodeCounter].getAttribute('id') == 'base'))
{
namedView = newDoc.childNodes[nodeCounter];
}
}
if (namedView)
{
namedView.setAttributeNS(NSS['inkscape'], 'current-layer', exportedLayers[0].getAttributeNS(NSS['inkscape'], 'label'));
}
}
// Add exported layers.
while (exportedLayers.length &gt; 0)
{
var nd = exportedLayers.pop();
nd.setAttribute(&quot;opacity&quot;,1);
nd.style.display = &quot;inherit&quot;;
newDoc.appendChild(nd);
}
// Serialise the new document.
window.location = 'data:application/svg+xml;base64;charset=utf-8,' + window.btoa(unescape(encodeURIComponent((new XMLSerializer()).serializeToString(newDoc))));
// Unsuspend redraw.
ROOT_NODE.unsuspendRedraw(suspendHandle);
ROOT_NODE.forceRedraw();
}
/** Function to undo last drawing operation.
*/
function drawingUndo()
{
mouse_presentation_path = null;
mouse_original_path = null;
if (history_presentation_elements.length &gt; 0)
{
var p = history_presentation_elements.pop();
var parent = p.parentNode.removeChild(p);
p = history_original_elements.pop();
parent = p.parentNode.removeChild(p);
}
}
/** Event handler for mouse down in drawing mode.
*
* @param e the event
*/
function drawingMousedown(e)
{
var value = 0;
if (e.button)
value = e.button;
else if (e.which)
value = e.which;
if (value == 1)
{
history_counter++;
var p = calcCoord(e);
mouse_last_x = e.clientX;
mouse_last_y = e.clientY;
mouse_original_path = document.createElementNS(NSS[&quot;svg&quot;], &quot;path&quot;);
mouse_original_path.setAttribute(&quot;stroke&quot;, path_colour);
mouse_original_path.setAttribute(&quot;stroke-width&quot;, path_paint_width);
mouse_original_path.setAttribute(&quot;fill&quot;, &quot;none&quot;);
mouse_original_path.setAttribute(&quot;id&quot;, &quot;path &quot; + Date());
mouse_original_path.setAttribute(&quot;d&quot;, &quot;M&quot; + p.x + &quot;,&quot; + p.y);
slides[activeSlide][&quot;original_element&quot;].appendChild(mouse_original_path);
history_original_elements.push(mouse_original_path);
mouse_presentation_path = document.createElementNS(NSS[&quot;svg&quot;], &quot;path&quot;);
mouse_presentation_path.setAttribute(&quot;stroke&quot;, path_colour);
mouse_presentation_path.setAttribute(&quot;stroke-width&quot;, path_paint_width);
mouse_presentation_path.setAttribute(&quot;fill&quot;, &quot;none&quot;);
mouse_presentation_path.setAttribute(&quot;id&quot;, &quot;path &quot; + Date() + &quot; presentation copy&quot;);
mouse_presentation_path.setAttribute(&quot;d&quot;, &quot;M&quot; + p.x + &quot;,&quot; + p.y);
if (slides[activeSlide][&quot;viewGroup&quot;])
slides[activeSlide][&quot;viewGroup&quot;].appendChild(mouse_presentation_path);
else
slides[activeSlide][&quot;element&quot;].appendChild(mouse_presentation_path);
history_presentation_elements.push(mouse_presentation_path);
return false;
}
return true;
}
/** Event handler for mouse up in drawing mode.
*
* @param e the event
*/
function drawingMouseup(e)
{
if(!e)
e = window.event;
if (mouse_presentation_path != null)
{
var p = calcCoord(e);
var d = mouse_presentation_path.getAttribute(&quot;d&quot;);
d += &quot; L&quot; + p.x + &quot;,&quot; + p.y;
mouse_presentation_path.setAttribute(&quot;d&quot;, d);
mouse_presentation_path = null;
mouse_original_path.setAttribute(&quot;d&quot;, d);
mouse_original_path = null;
return false;
}
return true;
}
/** Event handler for mouse move in drawing mode.
*
* @param e the event
*/
function drawingMousemove(e)
{
if(!e)
e = window.event;
var dist = (mouse_last_x - e.clientX) * (mouse_last_x - e.clientX) + (mouse_last_y - e.clientY) * (mouse_last_y - e.clientY);
if (mouse_presentation_path == null)
{
return true;
}
if (dist &gt;= mouse_min_dist_sqr)
{
var p = calcCoord(e);
var d = mouse_presentation_path.getAttribute(&quot;d&quot;);
d += &quot; L&quot; + p.x + &quot;,&quot; + p.y;
mouse_presentation_path.setAttribute(&quot;d&quot;, d);
mouse_original_path.setAttribute(&quot;d&quot;, d);
mouse_last_x = e.clientX;
mouse_last_y = e.clientY;
}
return false;
}
/** Event handler for mouse wheel events in slide mode.
* based on http://adomas.org/javascript-mouse-wheel/
*
* @param e the event
*/
function slideMousewheel(e)
{
var delta = 0;
if (!e)
e = window.event;
if (e.wheelDelta)
{ // IE Opera
delta = e.wheelDelta/120;
}
else if (e.detail)
{ // MOZ
delta = -e.detail/3;
}
if (delta &gt; 0)
skipEffects(-1);
else if (delta &lt; 0)
skipEffects(1);
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
/** Event handler for mouse wheel events in index mode.
* based on http://adomas.org/javascript-mouse-wheel/
*
* @param e the event
*/
function indexMousewheel(e)
{
var delta = 0;
if (!e)
e = window.event;
if (e.wheelDelta)
{ // IE Opera
delta = e.wheelDelta/120;
}
else if (e.detail)
{ // MOZ
delta = -e.detail/3;
}
if (delta &gt; 0)
indexSetPageSlide(activeSlide - INDEX_COLUMNS * INDEX_COLUMNS);
else if (delta &lt; 0)
indexSetPageSlide(activeSlide + INDEX_COLUMNS * INDEX_COLUMNS);
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
/** Function to set the path paint width.
*/
function set_path_paint_width()
{
var svgPoint1 = document.documentElement.createSVGPoint();
var svgPoint2 = document.documentElement.createSVGPoint();
svgPoint1.x = 0.0;
svgPoint1.y = 0.0;
svgPoint2.x = 1.0;
svgPoint2.y = 0.0;
var matrix = slides[activeSlide][&quot;element&quot;].getTransformToElement(ROOT_NODE);
if (slides[activeSlide][&quot;viewGroup&quot;])
matrix = slides[activeSlide][&quot;viewGroup&quot;].getTransformToElement(ROOT_NODE);
svgPoint1 = svgPoint1.matrixTransform(matrix);
svgPoint2 = svgPoint2.matrixTransform(matrix);
path_paint_width = path_width / Math.sqrt((svgPoint2.x - svgPoint1.x) * (svgPoint2.x - svgPoint1.x) + (svgPoint2.y - svgPoint1.y) * (svgPoint2.y - svgPoint1.y));
}
/** The view effect.
*
* @param dir direction the effect should be played (1 = forwards, -1 = backwards)
* @param element the element the effect should be applied to
* @param time the time that has elapsed since the beginning of the effect
* @param options a dictionary with additional options (e.g. length of the effect); for the view effect the options need to contain the old and the new matrix.
*/
function view(dir, element, time, options)
{
var length = 250;
var fraction;
if (!options[&quot;matrixInitial&quot;])
{
var tempString = slides[activeSlide][&quot;viewGroup&quot;].getAttribute(&quot;transform&quot;);
if (tempString)
options[&quot;matrixInitial&quot;] = (new matrixSVG()).fromAttribute(tempString);
else
options[&quot;matrixInitial&quot;] = (new matrixSVG()).fromSVGElements(1, 0, 0, 1, 0, 0);
}
if ((time == STATE_END) || (time == STATE_START))
fraction = 1;
else
{
if (options &amp;&amp; options[&quot;length&quot;])
length = options[&quot;length&quot;];
fraction = time / length;
}
if (dir == 1)
{
if (fraction &lt;= 0)
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixInitial&quot;].toAttribute());
}
else if (fraction &gt;= 1)
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixNew&quot;].toAttribute());
set_path_paint_width();
options[&quot;matrixInitial&quot;] = null;
return true;
}
else
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixInitial&quot;].mix(options[&quot;matrixNew&quot;], fraction).toAttribute());
}
}
else if (dir == -1)
{
if (fraction &lt;= 0)
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixInitial&quot;].toAttribute());
}
else if (fraction &gt;= 1)
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixOld&quot;].toAttribute());
set_path_paint_width();
options[&quot;matrixInitial&quot;] = null;
return true;
}
else
{
element.setAttribute(&quot;transform&quot;, options[&quot;matrixInitial&quot;].mix(options[&quot;matrixOld&quot;], fraction).toAttribute());
}
}
return false;
}
/** The fade effect.
*
* @param dir direction the effect should be played (1 = forwards, -1 = backwards)
* @param element the element the effect should be applied to
* @param time the time that has elapsed since the beginning of the effect
* @param options a dictionary with additional options (e.g. length of the effect)
*/
function fade(dir, element, time, options)
{
var length = 250;
var fraction;
if ((time == STATE_END) || (time == STATE_START))
fraction = 1;
else
{
if (options &amp;&amp; options[&quot;length&quot;])
length = options[&quot;length&quot;];
fraction = time / length;
}
if (dir == 1)
{
if (fraction &lt;= 0)
{
element.style.display = &quot;none&quot;;
element.setAttribute(&quot;opacity&quot;, 0);
}
else if (fraction &gt;= 1)
{
element.style.display = &quot;inherit&quot;;
element.setAttribute(&quot;opacity&quot;, 1);
return true;
}
else
{
element.style.display = &quot;inherit&quot;;
element.setAttribute(&quot;opacity&quot;, fraction);
}
}
else if (dir == -1)
{
if (fraction &lt;= 0)
{
element.style.display = &quot;inherit&quot;;
element.setAttribute(&quot;opacity&quot;, 1);
}
else if (fraction &gt;= 1)
{
element.setAttribute(&quot;opacity&quot;, 0);
element.style.display = &quot;none&quot;;
return true;
}
else
{
element.style.display = &quot;inherit&quot;;
element.setAttribute(&quot;opacity&quot;, 1 - fraction);
}
}
return false;
}
/** The appear effect.
*
* @param dir direction the effect should be played (1 = forwards, -1 = backwards)
* @param element the element the effect should be applied to
* @param time the time that has elapsed since the beginning of the effect
* @param options a dictionary with additional options (e.g. length of the effect)
*/
function appear(dir, element, time, options)
{
if (dir == 1)
{
element.style.display = &quot;inherit&quot;;
element.setAttribute(&quot;opacity&quot;,1);
}
else if (dir == -1)
{
element.style.display = &quot;none&quot;;
element.setAttribute(&quot;opacity&quot;,0);
}
return true;
}
/** The pop effect.
*
* @param dir direction the effect should be played (1 = forwards, -1 = backwards)
* @param element the element the effect should be applied to
* @param time the time that has elapsed since the beginning of the effect
* @param options a dictionary with additional options (e.g. length of the effect)
*/
function pop(dir, element, time, options)
{
var length = 500;
var fraction;
if ((time == STATE_END) || (time == STATE_START))
fraction = 1;
else
{
if (options &amp;&amp; options[&quot;length&quot;])
length = options[&quot;length&quot;];
fraction = time / length;
}
if (dir == 1)
{
if (fraction &lt;= 0)
{
element.setAttribute(&quot;opacity&quot;, 0);
element.setAttribute(&quot;transform&quot;, &quot;scale(0)&quot;);
element.style.display = &quot;none&quot;;
}
else if (fraction &gt;= 1)
{
element.setAttribute(&quot;opacity&quot;, 1);
element.removeAttribute(&quot;transform&quot;);
element.style.display = &quot;inherit&quot;;
return true;
}
else
{
element.style.display = &quot;inherit&quot;;
var opacityFraction = fraction * 3;
if (opacityFraction &gt; 1)
opacityFraction = 1;
element.setAttribute(&quot;opacity&quot;, opacityFraction);
var offsetX = WIDTH * (1.0 - fraction) / 2.0;
var offsetY = HEIGHT * (1.0 - fraction) / 2.0;
element.setAttribute(&quot;transform&quot;, &quot;translate(&quot; + offsetX + &quot;,&quot; + offsetY + &quot;) scale(&quot; + fraction + &quot;)&quot;);
}
}
else if (dir == -1)
{
if (fraction &lt;= 0)
{
element.setAttribute(&quot;opacity&quot;, 1);
element.setAttribute(&quot;transform&quot;, &quot;scale(1)&quot;);
element.style.display = &quot;inherit&quot;;
}
else if (fraction &gt;= 1)
{
element.setAttribute(&quot;opacity&quot;, 0);
element.removeAttribute(&quot;transform&quot;);
element.style.display = &quot;none&quot;;
return true;
}
else
{
element.setAttribute(&quot;opacity&quot;, 1 - fraction);
element.setAttribute(&quot;transform&quot;, &quot;scale(&quot; + 1 - fraction + &quot;)&quot;);
element.style.display = &quot;inherit&quot;;
}
}
return false;
}
/** Function to set a slide either to the start or the end state.
*
* @param slide the slide to use
* @param state the state into which the slide should be set
*/
function setSlideToState(slide, state)
{
slides[slide][&quot;viewGroup&quot;].setAttribute(&quot;transform&quot;, slides[slide].initialView);
if (slides[slide][&quot;effects&quot;])
{
if (state == STATE_END)
{
for (var counter = 0; counter &lt; slides[slide][&quot;effects&quot;].length; counter++)
{
for (var subCounter = 0; subCounter &lt; slides[slide][&quot;effects&quot;][counter].length; subCounter++)
{
var effect = slides[slide][&quot;effects&quot;][counter][subCounter];
if (effect[&quot;effect&quot;] == &quot;fade&quot;)
fade(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;appear&quot;)
appear(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;pop&quot;)
pop(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;view&quot;)
view(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
}
}
}
else if (state == STATE_START)
{
for (var counter = slides[slide][&quot;effects&quot;].length - 1; counter &gt;= 0; counter--)
{
for (var subCounter = 0; subCounter &lt; slides[slide][&quot;effects&quot;][counter].length; subCounter++)
{
var effect = slides[slide][&quot;effects&quot;][counter][subCounter];
if (effect[&quot;effect&quot;] == &quot;fade&quot;)
fade(parseInt(effect[&quot;dir&quot;]) * -1, effect[&quot;element&quot;], STATE_START, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;appear&quot;)
appear(parseInt(effect[&quot;dir&quot;]) * -1, effect[&quot;element&quot;], STATE_START, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;pop&quot;)
pop(parseInt(effect[&quot;dir&quot;]) * -1, effect[&quot;element&quot;], STATE_START, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;view&quot;)
view(parseInt(effect[&quot;dir&quot;]) * -1, effect[&quot;element&quot;], STATE_START, effect[&quot;options&quot;]);
}
}
}
else
{
setSlideToState(slide, STATE_START);
for (var counter = 0; counter &lt; slides[slide][&quot;effects&quot;].length &amp;&amp; counter &lt; state; counter++)
{
for (var subCounter = 0; subCounter &lt; slides[slide][&quot;effects&quot;][counter].length; subCounter++)
{
var effect = slides[slide][&quot;effects&quot;][counter][subCounter];
if (effect[&quot;effect&quot;] == &quot;fade&quot;)
fade(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;appear&quot;)
appear(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;pop&quot;)
pop(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
else if (effect[&quot;effect&quot;] == &quot;view&quot;)
view(effect[&quot;dir&quot;], effect[&quot;element&quot;], STATE_END, effect[&quot;options&quot;]);
}
}
}
}
window.location.hash = (activeSlide + 1) + '_' + activeEffect;
}
/** Convenience function to translate a attribute string into a dictionary.
*
* @param str the attribute string
* @return a dictionary
* @see dictToPropStr
*/
function propStrToDict(str)
{
var list = str.split(&quot;;&quot;);
var obj = new Object();
for (var counter = 0; counter &lt; list.length; counter++)
{
var subStr = list[counter];
var subList = subStr.split(&quot;:&quot;);
if (subList.length == 2)
{
obj[subList[0]] = subList[1];
}
}
return obj;
}
/** Convenience function to translate a dictionary into a string that can be used as an attribute.
*
* @param dict the dictionary to convert
* @return a string that can be used as an attribute
* @see propStrToDict
*/
function dictToPropStr(dict)
{
var str = &quot;&quot;;
for (var key in dict)
{
str += key + &quot;:&quot; + dict[key] + &quot;;&quot;;
}
return str;
}
/** Sub-function to add a suffix to the ids of the node and all its children.
*
* @param node the node to change
* @param suffix the suffix to add
* @param replace dictionary of replaced ids
* @see suffixNodeIds
*/
function suffixNoneIds_sub(node, suffix, replace)
{
if (node.nodeType == 1)
{
if (node.getAttribute(&quot;id&quot;))
{
var id = node.getAttribute(&quot;id&quot;)
replace[&quot;#&quot; + id] = id + suffix;
node.setAttribute(&quot;id&quot;, id + suffix);
}
if ((node.nodeName == &quot;use&quot;) &amp;&amp; (node.getAttributeNS(NSS[&quot;xlink&quot;], &quot;href&quot;)) &amp;&amp; (replace[node.getAttribute(NSS[&quot;xlink&quot;], &quot;href&quot;)]))
node.setAttribute(NSS[&quot;xlink&quot;], &quot;href&quot;, node.getAttribute(NSS[&quot;xlink&quot;], &quot;href&quot;) + suffix);
if (node.childNodes)
{
for (var counter = 0; counter &lt; node.childNodes.length; counter++)
suffixNoneIds_sub(node.childNodes[counter], suffix, replace);
}
}
}
/** Function to add a suffix to the ids of the node and all its children.
*
* @param node the node to change
* @param suffix the suffix to add
* @return the changed node
* @see suffixNodeIds_sub
*/
function suffixNodeIds(node, suffix)
{
var replace = new Object();
suffixNoneIds_sub(node, suffix, replace);
return node;
}
/** Function to build a progress bar.
*
* @param parent node to attach the progress bar to
*/
function createProgressBar(parent_node)
{
var g = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
g.setAttribute(&quot;clip-path&quot;, &quot;url(#jessyInkSlideClipPath)&quot;);
g.setAttribute(&quot;id&quot;, &quot;layer_progress_bar&quot;);
g.setAttribute(&quot;style&quot;, &quot;display: none;&quot;);
var rect_progress_bar = document.createElementNS(NSS[&quot;svg&quot;], &quot;rect&quot;);
rect_progress_bar.setAttribute(&quot;style&quot;, &quot;marker: none; fill: rgb(128, 128, 128); stroke: none;&quot;);
rect_progress_bar.setAttribute(&quot;id&quot;, &quot;rect_progress_bar&quot;);
rect_progress_bar.setAttribute(&quot;x&quot;, 0);
rect_progress_bar.setAttribute(&quot;y&quot;, 0.99 * HEIGHT);
rect_progress_bar.setAttribute(&quot;width&quot;, 0);
rect_progress_bar.setAttribute(&quot;height&quot;, 0.01 * HEIGHT);
g.appendChild(rect_progress_bar);
var circle_timer_indicator = document.createElementNS(NSS[&quot;svg&quot;], &quot;circle&quot;);
circle_timer_indicator.setAttribute(&quot;style&quot;, &quot;marker: none; fill: rgb(255, 0, 0); stroke: none;&quot;);
circle_timer_indicator.setAttribute(&quot;id&quot;, &quot;circle_timer_indicator&quot;);
circle_timer_indicator.setAttribute(&quot;cx&quot;, 0.005 * HEIGHT);
circle_timer_indicator.setAttribute(&quot;cy&quot;, 0.995 * HEIGHT);
circle_timer_indicator.setAttribute(&quot;r&quot;, 0.005 * HEIGHT);
g.appendChild(circle_timer_indicator);
parent_node.appendChild(g);
}
/** Function to hide the progress bar.
*
*/
function hideProgressBar()
{
var progress_bar = document.getElementById(&quot;layer_progress_bar&quot;);
if (!progress_bar)
{
return;
}
progress_bar.setAttribute(&quot;style&quot;, &quot;display: none;&quot;);
}
/** Function to show the progress bar.
*
*/
function showProgressBar()
{
var progress_bar = document.getElementById(&quot;layer_progress_bar&quot;);
if (!progress_bar)
{
return;
}
progress_bar.setAttribute(&quot;style&quot;, &quot;display: inherit;&quot;);
}
/** Set progress bar value.
*
* @param value the current slide number
*
*/
function setProgressBarValue(value)
{
var rect_progress_bar = document.getElementById(&quot;rect_progress_bar&quot;);
if (!rect_progress_bar)
{
return;
}
if (value &lt; 1)
{
// First slide, assumed to be the title of the presentation
var x = 0;
var w = 0.01 * HEIGHT;
}
else if (value &gt;= slides.length - 1)
{
// Last slide, assumed to be the end of the presentation
var x = WIDTH - 0.01 * HEIGHT;
var w = 0.01 * HEIGHT;
}
else
{
value -= 1;
value /= (slides.length - 2);
var x = WIDTH * value;
var w = WIDTH / (slides.length - 2);
}
rect_progress_bar.setAttribute(&quot;x&quot;, x);
rect_progress_bar.setAttribute(&quot;width&quot;, w);
}
/** Set time indicator.
*
* @param value the percentage of time elapse so far between 0.0 and 1.0
*
*/
function setTimeIndicatorValue(value)
{
var circle_timer_indicator = document.getElementById(&quot;circle_timer_indicator&quot;);
if (!circle_timer_indicator)
{
return;
}
if (value &lt; 0.0)
{
value = 0.0;
}
if (value &gt; 1.0)
{
value = 1.0;
}
var cx = (WIDTH - 0.01 * HEIGHT) * value + 0.005 * HEIGHT;
circle_timer_indicator.setAttribute(&quot;cx&quot;, cx);
}
/** Update timer.
*
*/
function updateTimer()
{
timer_elapsed += 1;
setTimeIndicatorValue((timer_elapsed - timer_start) / (60 * timer_duration));
}
/** Convert screen coordinates to document coordinates.
*
* @param e event with screen coordinates
*
* @return coordinates in SVG file coordinate system
*/
function calcCoord(e)
{
var svgPoint = document.documentElement.createSVGPoint();
svgPoint.x = e.clientX + window.pageXOffset;
svgPoint.y = e.clientY + window.pageYOffset;
var matrix = slides[activeSlide][&quot;element&quot;].getScreenCTM();
if (slides[activeSlide][&quot;viewGroup&quot;])
matrix = slides[activeSlide][&quot;viewGroup&quot;].getScreenCTM();
svgPoint = svgPoint.matrixTransform(matrix.inverse());
return svgPoint;
}
/** Add slide.
*
* @param after_slide after which slide the new slide should be inserted into the presentation
*/
function addSlide(after_slide)
{
number_of_added_slides++;
var g = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
g.setAttribute(&quot;clip-path&quot;, &quot;url(#jessyInkSlideClipPath)&quot;);
g.setAttribute(&quot;id&quot;, &quot;Whiteboard &quot; + Date() + &quot; presentation copy&quot;);
g.setAttribute(&quot;style&quot;, &quot;display: none;&quot;);
var new_slide = new Object();
new_slide[&quot;element&quot;] = g;
// Set build in transition.
new_slide[&quot;transitionIn&quot;] = new Object();
var dict = defaultTransitionInDict;
new_slide[&quot;transitionIn&quot;][&quot;name&quot;] = dict[&quot;name&quot;];
new_slide[&quot;transitionIn&quot;][&quot;options&quot;] = new Object();
for (key in dict)
if (key != &quot;name&quot;)
new_slide[&quot;transitionIn&quot;][&quot;options&quot;][key] = dict[key];
// Set build out transition.
new_slide[&quot;transitionOut&quot;] = new Object();
dict = defaultTransitionOutDict;
new_slide[&quot;transitionOut&quot;][&quot;name&quot;] = dict[&quot;name&quot;];
new_slide[&quot;transitionOut&quot;][&quot;options&quot;] = new Object();
for (key in dict)
if (key != &quot;name&quot;)
new_slide[&quot;transitionOut&quot;][&quot;options&quot;][key] = dict[key];
// Copy master slide content.
if (masterSlide)
{
var clonedNode = suffixNodeIds(masterSlide.cloneNode(true), &quot;_&quot; + Date() + &quot; presentation_copy&quot;);
clonedNode.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;);
clonedNode.removeAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;);
clonedNode.style.display = &quot;inherit&quot;;
g.appendChild(clonedNode);
}
// Substitute auto texts.
substituteAutoTexts(g, &quot;Whiteboard &quot; + number_of_added_slides, &quot;W&quot; + number_of_added_slides, slides.length);
g.setAttribute(&quot;onmouseover&quot;, &quot;if ((currentMode == INDEX_MODE) &amp;&amp; ( activeSlide != &quot; + (after_slide + 1) + &quot;)) { indexSetActiveSlide(&quot; + (after_slide + 1) + &quot;); };&quot;);
// Create a transform group.
var transformGroup = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
// Add content to transform group.
while (g.firstChild)
transformGroup.appendChild(g.firstChild);
// Transfer the transform attribute from the node to the transform group.
if (g.getAttribute(&quot;transform&quot;))
{
transformGroup.setAttribute(&quot;transform&quot;, g.getAttribute(&quot;transform&quot;));
g.removeAttribute(&quot;transform&quot;);
}
// Create a view group.
var viewGroup = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
viewGroup.appendChild(transformGroup);
new_slide[&quot;viewGroup&quot;] = g.appendChild(viewGroup);
// Insert background.
if (BACKGROUND_COLOR != null)
{
var rectNode = document.createElementNS(NSS[&quot;svg&quot;], &quot;rect&quot;);
rectNode.setAttribute(&quot;x&quot;, 0);
rectNode.setAttribute(&quot;y&quot;, 0);
rectNode.setAttribute(&quot;width&quot;, WIDTH);
rectNode.setAttribute(&quot;height&quot;, HEIGHT);
rectNode.setAttribute(&quot;id&quot;, &quot;jessyInkBackground&quot; + Date());
rectNode.setAttribute(&quot;fill&quot;, BACKGROUND_COLOR);
new_slide[&quot;viewGroup&quot;].insertBefore(rectNode, new_slide[&quot;viewGroup&quot;].firstChild);
}
// Set initial view even if there are no other views.
var matrixOld = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
new_slide[&quot;viewGroup&quot;].setAttribute(&quot;transform&quot;, matrixOld.toAttribute());
new_slide.initialView = matrixOld.toAttribute();
// Insert slide
var node = slides[after_slide][&quot;element&quot;];
var next_node = node.nextSibling;
var parent_node = node.parentNode;
if (next_node)
{
parent_node.insertBefore(g, next_node);
}
else
{
parent_node.appendChild(g);
}
g = document.createElementNS(NSS[&quot;svg&quot;], &quot;g&quot;);
g.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;groupmode&quot;, &quot;layer&quot;);
g.setAttributeNS(NSS[&quot;inkscape&quot;], &quot;label&quot;, &quot;Whiteboard &quot; + number_of_added_slides);
g.setAttribute(&quot;clip-path&quot;, &quot;url(#jessyInkSlideClipPath)&quot;);
g.setAttribute(&quot;id&quot;, &quot;Whiteboard &quot; + Date());
g.setAttribute(&quot;style&quot;, &quot;display: none;&quot;);
new_slide[&quot;original_element&quot;] = g;
node = slides[after_slide][&quot;original_element&quot;];
next_node = node.nextSibling;
parent_node = node.parentNode;
if (next_node)
{
parent_node.insertBefore(g, next_node);
}
else
{
parent_node.appendChild(g);
}
before_new_slide = slides.slice(0, after_slide + 1);
after_new_slide = slides.slice(after_slide + 1);
slides = before_new_slide.concat(new_slide, after_new_slide);
//resetting the counter attributes on the slides that follow the new slide...
for (var counter = after_slide+2; counter &lt; slides.length; counter++)
{
slides[counter][&quot;element&quot;].setAttribute(&quot;onmouseover&quot;, &quot;if ((currentMode == INDEX_MODE) &amp;&amp; ( activeSlide != &quot; + counter + &quot;)) { indexSetActiveSlide(&quot; + counter + &quot;); };&quot;);
}
}
/** Convenience function to obtain a transformation matrix from a point matrix.
*
* @param mPoints Point matrix.
* @return A transformation matrix.
*/
function pointMatrixToTransformation(mPoints)
{
mPointsOld = (new matrixSVG()).fromElements(0, WIDTH, WIDTH, 0, 0, HEIGHT, 1, 1, 1);
return mPointsOld.mult(mPoints.inv());
}
/** Convenience function to obtain a matrix with three corners of a rectangle.
*
* @param rect an svg rectangle
* @return a matrixSVG containing three corners of the rectangle
*/
function rectToMatrix(rect)
{
rectWidth = rect.getBBox().width;
rectHeight = rect.getBBox().height;
rectX = rect.getBBox().x;
rectY = rect.getBBox().y;
rectXcorr = 0;
rectYcorr = 0;
scaleX = WIDTH / rectWidth;
scaleY = HEIGHT / rectHeight;
if (scaleX &gt; scaleY)
{
scaleX = scaleY;
rectXcorr -= (WIDTH / scaleX - rectWidth) / 2;
rectWidth = WIDTH / scaleX;
}
else
{
scaleY = scaleX;
rectYcorr -= (HEIGHT / scaleY - rectHeight) / 2;
rectHeight = HEIGHT / scaleY;
}
if (rect.transform.baseVal.numberOfItems &lt; 1)
{
mRectTrans = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
}
else
{
mRectTrans = (new matrixSVG()).fromSVGMatrix(rect.transform.baseVal.consolidate().matrix);
}
newBasePoints = (new matrixSVG()).fromElements(rectX, rectX, rectX, rectY, rectY, rectY, 1, 1, 1);
newVectors = (new matrixSVG()).fromElements(rectXcorr, rectXcorr + rectWidth, rectXcorr + rectWidth, rectYcorr, rectYcorr, rectYcorr + rectHeight, 0, 0, 0);
return mRectTrans.mult(newBasePoints.add(newVectors));
}
/** Function to handle JessyInk elements.
*
* @param node Element node.
*/
function handleElement(node)
{
if (node.getAttributeNS(NSS['jessyink'], 'element') == 'core.video')
{
var url;
var width;
var height;
var x;
var y;
var transform;
var tspans = node.getElementsByTagNameNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;tspan&quot;);
for (var tspanCounter = 0; tspanCounter &lt; tspans.length; tspanCounter++)
{
if (tspans[tspanCounter].getAttributeNS(&quot;https://launchpad.net/jessyink&quot;, &quot;video&quot;) == &quot;url&quot;)
{
url = tspans[tspanCounter].firstChild.nodeValue;
}
}
var rects = node.getElementsByTagNameNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;rect&quot;);
for (var rectCounter = 0; rectCounter &lt; rects.length; rectCounter++)
{
if (rects[rectCounter].getAttributeNS(&quot;https://launchpad.net/jessyink&quot;, &quot;video&quot;) == &quot;rect&quot;)
{
x = rects[rectCounter].getAttribute(&quot;x&quot;);
y = rects[rectCounter].getAttribute(&quot;y&quot;);
width = rects[rectCounter].getAttribute(&quot;width&quot;);
height = rects[rectCounter].getAttribute(&quot;height&quot;);
transform = rects[rectCounter].getAttribute(&quot;transform&quot;);
}
}
for (var childCounter = 0; childCounter &lt; node.childNodes.length; childCounter++)
{
if (node.childNodes[childCounter].nodeType == 1)
{
if (node.childNodes[childCounter].style)
{
node.childNodes[childCounter].style.display = 'none';
}
else
{
node.childNodes[childCounter].setAttribute(&quot;style&quot;, &quot;display: none;&quot;);
}
}
}
var foreignNode = document.createElementNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;foreignObject&quot;);
foreignNode.setAttribute(&quot;x&quot;, x);
foreignNode.setAttribute(&quot;y&quot;, y);
foreignNode.setAttribute(&quot;width&quot;, width);
foreignNode.setAttribute(&quot;height&quot;, height);
foreignNode.setAttribute(&quot;transform&quot;, transform);
var videoNode = document.createElementNS(&quot;http://www.w3.org/1999/xhtml&quot;, &quot;video&quot;);
videoNode.setAttribute(&quot;src&quot;, url);
foreignNode.appendChild(videoNode);
node.appendChild(foreignNode);
}
}
/** Class processing the location hash.
*
* @param str location hash
*/
function LocationHash(str)
{
this.slideNumber = 0;
this.effectNumber = 0;
str = str.substr(1, str.length - 1);
var parts = str.split('_');
// Try to extract slide number.
if (parts.length &gt;= 1)
{
try
{
var slideNumber = parseInt(parts[0]);
if (!isNaN(slideNumber))
{
this.slideNumber = slideNumber - 1;
}
}
catch (e)
{
}
}
// Try to extract effect number.
if (parts.length &gt;= 2)
{
try
{
var effectNumber = parseInt(parts[1]);
if (!isNaN(effectNumber))
{
this.effectNumber = effectNumber;
}
}
catch (e)
{
}
}
}
/** Class representing an svg matrix.
*/
function matrixSVG()
{
this.e11 = 0; // a
this.e12 = 0; // c
this.e13 = 0; // e
this.e21 = 0; // b
this.e22 = 0; // d
this.e23 = 0; // f
this.e31 = 0;
this.e32 = 0;
this.e33 = 0;
}
/** Constructor function.
*
* @param a element a (i.e. 1, 1) as described in the svg standard.
* @param b element b (i.e. 2, 1) as described in the svg standard.
* @param c element c (i.e. 1, 2) as described in the svg standard.
* @param d element d (i.e. 2, 2) as described in the svg standard.
* @param e element e (i.e. 1, 3) as described in the svg standard.
* @param f element f (i.e. 2, 3) as described in the svg standard.
*/
matrixSVG.prototype.fromSVGElements = function(a, b, c, d, e, f)
{
this.e11 = a;
this.e12 = c;
this.e13 = e;
this.e21 = b;
this.e22 = d;
this.e23 = f;
this.e31 = 0;
this.e32 = 0;
this.e33 = 1;
return this;
}
/** Constructor function.
*
* @param matrix an svg matrix as described in the svg standard.
*/
matrixSVG.prototype.fromSVGMatrix = function(m)
{
this.e11 = m.a;
this.e12 = m.c;
this.e13 = m.e;
this.e21 = m.b;
this.e22 = m.d;
this.e23 = m.f;
this.e31 = 0;
this.e32 = 0;
this.e33 = 1;
return this;
}
/** Constructor function.
*
* @param e11 element 1, 1 of the matrix.
* @param e12 element 1, 2 of the matrix.
* @param e13 element 1, 3 of the matrix.
* @param e21 element 2, 1 of the matrix.
* @param e22 element 2, 2 of the matrix.
* @param e23 element 2, 3 of the matrix.
* @param e31 element 3, 1 of the matrix.
* @param e32 element 3, 2 of the matrix.
* @param e33 element 3, 3 of the matrix.
*/
matrixSVG.prototype.fromElements = function(e11, e12, e13, e21, e22, e23, e31, e32, e33)
{
this.e11 = e11;
this.e12 = e12;
this.e13 = e13;
this.e21 = e21;
this.e22 = e22;
this.e23 = e23;
this.e31 = e31;
this.e32 = e32;
this.e33 = e33;
return this;
}
/** Constructor function.
*
* @param attrString string value of the &quot;transform&quot; attribute (currently only &quot;matrix&quot; is accepted)
*/
matrixSVG.prototype.fromAttribute = function(attrString)
{
str = attrString.substr(7, attrString.length - 8);
str = str.trim();
strArray = str.split(&quot;,&quot;);
// Opera does not use commas to separate the values of the matrix, only spaces.
if (strArray.length != 6)
strArray = str.split(&quot; &quot;);
this.e11 = parseFloat(strArray[0]);
this.e21 = parseFloat(strArray[1]);
this.e31 = 0;
this.e12 = parseFloat(strArray[2]);
this.e22 = parseFloat(strArray[3]);
this.e32 = 0;
this.e13 = parseFloat(strArray[4]);
this.e23 = parseFloat(strArray[5]);
this.e33 = 1;
return this;
}
/** Output function
*
* @return a string that can be used as the &quot;transform&quot; attribute.
*/
matrixSVG.prototype.toAttribute = function()
{
return &quot;matrix(&quot; + this.e11 + &quot;, &quot; + this.e21 + &quot;, &quot; + this.e12 + &quot;, &quot; + this.e22 + &quot;, &quot; + this.e13 + &quot;, &quot; + this.e23 + &quot;)&quot;;
}
/** Matrix nversion.
*
* @return the inverse of the matrix
*/
matrixSVG.prototype.inv = function()
{
out = new matrixSVG();
det = this.e11 * (this.e33 * this.e22 - this.e32 * this.e23) - this.e21 * (this.e33 * this.e12 - this.e32 * this.e13) + this.e31 * (this.e23 * this.e12 - this.e22 * this.e13);
out.e11 = (this.e33 * this.e22 - this.e32 * this.e23) / det;
out.e12 = -(this.e33 * this.e12 - this.e32 * this.e13) / det;
out.e13 = (this.e23 * this.e12 - this.e22 * this.e13) / det;
out.e21 = -(this.e33 * this.e21 - this.e31 * this.e23) / det;
out.e22 = (this.e33 * this.e11 - this.e31 * this.e13) / det;
out.e23 = -(this.e23 * this.e11 - this.e21 * this.e13) / det;
out.e31 = (this.e32 * this.e21 - this.e31 * this.e22) / det;
out.e32 = -(this.e32 * this.e11 - this.e31 * this.e12) / det;
out.e33 = (this.e22 * this.e11 - this.e21 * this.e12) / det;
return out;
}
/** Matrix multiplication.
*
* @param op another svg matrix
* @return this * op
*/
matrixSVG.prototype.mult = function(op)
{
out = new matrixSVG();
out.e11 = this.e11 * op.e11 + this.e12 * op.e21 + this.e13 * op.e31;
out.e12 = this.e11 * op.e12 + this.e12 * op.e22 + this.e13 * op.e32;
out.e13 = this.e11 * op.e13 + this.e12 * op.e23 + this.e13 * op.e33;
out.e21 = this.e21 * op.e11 + this.e22 * op.e21 + this.e23 * op.e31;
out.e22 = this.e21 * op.e12 + this.e22 * op.e22 + this.e23 * op.e32;
out.e23 = this.e21 * op.e13 + this.e22 * op.e23 + this.e23 * op.e33;
out.e31 = this.e31 * op.e11 + this.e32 * op.e21 + this.e33 * op.e31;
out.e32 = this.e31 * op.e12 + this.e32 * op.e22 + this.e33 * op.e32;
out.e33 = this.e31 * op.e13 + this.e32 * op.e23 + this.e33 * op.e33;
return out;
}
/** Matrix addition.
*
* @param op another svg matrix
* @return this + op
*/
matrixSVG.prototype.add = function(op)
{
out = new matrixSVG();
out.e11 = this.e11 + op.e11;
out.e12 = this.e12 + op.e12;
out.e13 = this.e13 + op.e13;
out.e21 = this.e21 + op.e21;
out.e22 = this.e22 + op.e22;
out.e23 = this.e23 + op.e23;
out.e31 = this.e31 + op.e31;
out.e32 = this.e32 + op.e32;
out.e33 = this.e33 + op.e33;
return out;
}
/** Matrix mixing.
*
* @param op another svg matrix
* @parma contribOp contribution of the other matrix (0 &lt;= contribOp &lt;= 1)
* @return (1 - contribOp) * this + contribOp * op
*/
matrixSVG.prototype.mix = function(op, contribOp)
{
contribThis = 1.0 - contribOp;
out = new matrixSVG();
out.e11 = contribThis * this.e11 + contribOp * op.e11;
out.e12 = contribThis * this.e12 + contribOp * op.e12;
out.e13 = contribThis * this.e13 + contribOp * op.e13;
out.e21 = contribThis * this.e21 + contribOp * op.e21;
out.e22 = contribThis * this.e22 + contribOp * op.e22;
out.e23 = contribThis * this.e23 + contribOp * op.e23;
out.e31 = contribThis * this.e31 + contribOp * op.e31;
out.e32 = contribThis * this.e32 + contribOp * op.e32;
out.e33 = contribThis * this.e33 + contribOp * op.e33;
return out;
}
/** Trimming function for strings.
*/
String.prototype.trim = function()
{
return this.replace(/^\s+|\s+$/g, '');
}
/** SVGElement.getTransformToElement polyfill */
SVGElement.prototype.getTransformToElement = SVGElement.prototype.getTransformToElement || function(elem) {
return elem.getScreenCTM().inverse().multiply(this.getScreenCTM());
};
</script>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="MainSlide"
style="display:inline"
ns1:masterSlide="masterSlide">
<image
width="272.52084"
height="72.495834"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 "
id="image49"
x="10.697019"
y="508.59885" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Slide 1"
style="display:none">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:50.8px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="164.61226"
y="218.47365"
id="text55"><tspan
sodipodi:role="line"
id="tspan53"
x="164.61226"
y="218.47365"
style="font-size:50.8px;stroke-width:0.264583">Scanner run loop</tspan></text>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Slide 2"
style="display:inline;opacity:0.994;filter:url(#filter4875)">
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.577408;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect96"
width="235.74948"
height="237.83232"
x="178.64546"
y="105.0603" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.290399;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect96-3"
width="76.414612"
height="185.59735"
x="475.49954"
y="323.12125" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="477.11707"
y="333.77292"
id="text104-6"><tspan
sodipodi:role="line"
id="tspan102-7"
x="477.11707"
y="333.77292"
style="font-size:10.5833px;stroke-width:0.477691">Host Process</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:14.1111px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407"
x="357.19214"
y="369.60373"
id="text104-3"><tspan
sodipodi:role="line"
id="tspan102-5"
x="357.19214"
y="369.60373"
style="font-size:14.1111px;stroke-width:0.338407" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.12528;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect169"
width="200.70366"
height="162.98849"
x="187.93707"
y="164.46426" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="73.834061"
y="82.386292"
id="text173"><tspan
sodipodi:role="line"
id="tspan171"
x="73.834061"
y="82.386292"
style="stroke-width:0.264583" /><tspan
sodipodi:role="line"
x="73.834061"
y="84.50296"
style="stroke-width:0.264583"
id="tspan175" /></text>
<text
xml:space="preserve"
id="text177"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect179);fill:#000000;fill-opacity:1;stroke:none" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="181.04288"
y="123.38573"
id="text249"><tspan
sodipodi:role="line"
id="tspan247"
x="181.04288"
y="123.38573"
style="font-size:10.5833px;stroke-width:0.477691">Main Process</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.635464;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect255"
width="130.18625"
height="21.150541"
x="234.25877"
y="132.97066"
ry="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="239.51338"
y="137.28365"
id="text259"><tspan
sodipodi:role="line"
x="239.51338"
y="137.28365"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan8122">Before starting the scan, the scanner must be prepared</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="138.23903"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2086" /><tspan
sodipodi:role="line"
x="239.51338"
y="139.20065"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2088">Init logging facility</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="140.16226"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan283" /><tspan
sodipodi:role="line"
x="239.51338"
y="141.12387"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan287">Set the scan_id</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="142.08548"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan289" /><tspan
sodipodi:role="line"
x="239.51338"
y="143.04709"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan291">Load default preferences from the config file</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="144.0087"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan297" /><tspan
sodipodi:role="line"
x="239.51338"
y="144.97031"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan299">Initialize signal handlers</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="145.93192"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan293" /><tspan
sodipodi:role="line"
x="239.51338"
y="146.89352"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan301">Make the main process a group leader</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="147.85513"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan303" /><tspan
sodipodi:role="line"
x="239.51338"
y="148.81674"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan295">Read from Redis and load scan preferences (overide the defaults) and plugins list</tspan><tspan
sodipodi:role="line"
x="239.51338"
y="149.77835"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan265" /><tspan
sodipodi:role="line"
x="239.51338"
y="150.73375"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan267" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.64306px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="386.39038"
y="149.29202"
id="text307"><tspan
sodipodi:role="line"
id="tspan305"
x="386.39038"
y="149.29202"
style="stroke-width:0.477691"> </tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.64306px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="390.32373"
y="159.73592"
id="text311"><tspan
sodipodi:role="line"
id="tspan309"
x="390.32373"
y="159.73592"
style="stroke-width:0.477691"> </tspan></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.366308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-6)"
d="m 299.66813,154.95858 v 5.35656"
id="path313-9"
inkscape:transform-center-x="1.6753861"
inkscape:transform-center-y="-3.8051642" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.456698;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect255-9"
width="53.806362"
height="26.431669"
x="197.4893"
y="175.92784"
ry="0" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="111.7307"
y="80.278824"
id="text259-2"><tspan
sodipodi:role="line"
x="111.7307"
y="80.278824"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan267-6" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="199.51674"
y="178.31168"
id="text1778"><tspan
sodipodi:role="line"
id="tspan1776"
x="199.51674"
y="178.31168"
style="font-size:1.91078px;stroke-width:0.477691" /><tspan
sodipodi:role="line"
x="199.51674"
y="180.2411"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan2098">Before scanning a host, </tspan><tspan
sodipodi:role="line"
x="199.51674"
y="182.17053"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan4979" /><tspan
sodipodi:role="line"
x="199.51674"
y="184.09996"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan4981">the attack must be set</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="185.05536"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan2094" /><tspan
sodipodi:role="line"
x="199.51674"
y="186.01074"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan2102" /><tspan
sodipodi:role="line"
x="199.51674"
y="186.96614"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan2104" /><tspan
sodipodi:role="line"
x="199.51674"
y="187.92152"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan2096">Prepare the target list:</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="188.87692"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1794" /><tspan
sodipodi:role="line"
x="199.51674"
y="189.83231"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1788"> - eliminate duplicated</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="190.78769"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1800" /><tspan
sodipodi:role="line"
x="199.51674"
y="191.74309"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1802"> - eliminate excluded</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="192.69847"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1790"> </tspan><tspan
sodipodi:role="line"
x="199.51674"
y="193.65387"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1792"> - resolve hostnames</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="194.60925"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1796" /><tspan
sodipodi:role="line"
x="199.51674"
y="195.56465"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1798"> - apply host preference</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="196.52003"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1780" /><tspan
sodipodi:role="line"
x="199.51674"
y="197.47542"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1782">Validate port list</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="198.43082"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1784" /><tspan
sodipodi:role="line"
x="199.51674"
y="199.3862"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1786">Initialize the plugin scheduler</tspan><tspan
sodipodi:role="line"
x="199.51674"
y="200.3416"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan1998" /><tspan
sodipodi:role="line"
x="199.51674"
y="201.29698"
style="font-size:1.91078px;stroke-width:0.477691"
id="tspan2000" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.274307;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1804"
width="38.536793"
height="16.2845"
x="337.4689"
y="180.8537" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.82154px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.477691"
x="310.7605"
y="185.61803"
id="text1808"><tspan
sodipodi:role="line"
id="tspan1806"
x="310.7605"
y="185.61803"
style="font-size:3.82154px;stroke-width:0.477691">Start Boreas</tspan><tspan
sodipodi:role="line"
x="310.7605"
y="187.52879"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan2036" /><tspan
sodipodi:role="line"
x="310.7605"
y="189.43956"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan2038" /><tspan
sodipodi:role="line"
x="310.7605"
y="191.35034"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan2040" /><tspan
sodipodi:role="line"
x="310.7605"
y="193.26111"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan2042"> thread</tspan><tspan
sodipodi:role="line"
x="310.7605"
y="195.17188"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan2044" /><tspan
sodipodi:role="line"
x="310.7605"
y="197.08264"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan1952" /><tspan
sodipodi:role="line"
x="310.7605"
y="198.99342"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan1954" /><tspan
sodipodi:role="line"
x="310.7605"
y="200.90419"
style="font-size:3.82154px;stroke-width:0.477691"
id="tspan1958" /></text>
<path
style="display:inline;opacity:0.994;fill:#008000;stroke:#008000;stroke-width:0.755415;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)"
d="m 311.3423,188.06139 h 22.7805"
id="path313-3" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="116.73544"
y="84.66275"
id="text1962"><tspan
sodipodi:role="line"
id="tspan1960"
x="116.73544"
y="84.66275"
style="stroke-width:0.264583" /></text>
<text
xml:space="preserve"
style="font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="117.65777"
y="85.111115"
id="text1966"><tspan
sodipodi:role="line"
id="tspan1964"
x="117.65777"
y="85.111115"
style="stroke-width:0.264583" /><tspan
sodipodi:role="line"
x="117.65777"
y="85.640282"
style="stroke-width:0.264583"
id="tspan1970" /><tspan
sodipodi:role="line"
x="117.65777"
y="86.169441"
style="stroke-width:0.264583"
id="tspan1974" /><tspan
sodipodi:role="line"
x="117.65777"
y="86.698608"
style="stroke-width:0.264583"
id="tspan1976" /></text>
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="340.64999"
y="184.33376"
id="text2004"><tspan
sodipodi:role="line"
id="tspan2002"
x="340.64999"
y="184.33376"
style="font-size:1.27384px;stroke-width:0.477691">Boreas receives the host list and start checking for</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="185.29536"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2006" /><tspan
sodipodi:role="line"
x="340.64999"
y="186.25697"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2008">alive host.</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="187.21858"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2010" /><tspan
sodipodi:role="line"
x="340.64999"
y="188.18019"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2012">Each host found alived is put in a queue in the</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="189.1418"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2014" /><tspan
sodipodi:role="line"
x="340.64999"
y="190.10341"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2018">redis main kb.</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="191.06503"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2022" /><tspan
sodipodi:role="line"
x="340.64999"
y="192.02664"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2026">Once that Boreas finishes with the alive test</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="192.98825"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2032" /><tspan
sodipodi:role="line"
x="340.64999"
y="193.94986"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2034">the thread is closed</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="194.91147"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2274" /><tspan
sodipodi:role="line"
x="340.64999"
y="195.87308"
style="font-size:1.27384px;stroke-width:0.477691"
id="tspan2276">The scanner has a list of alive host in redis.</tspan><tspan
sodipodi:role="line"
x="340.64999"
y="196.83469"
style="stroke-width:0.477691"
id="tspan2030" /></text>
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="299.36444"
y="159.28195"
id="text2072"><tspan
sodipodi:role="line"
id="tspan2070"
x="299.36444"
y="159.28195"
style="stroke-width:0.477691"> </tspan></text>
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="272.46225"
y="188.5629"
id="text2114"><tspan
sodipodi:role="line"
id="tspan2112"
x="272.46225"
y="188.5629"
style="stroke-width:0.477691">Boreas is started in a new Thread.</tspan></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.169312;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1804-1"
width="38.596237"
height="6.1944871"
x="269.44122"
y="184.88358" />
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.478444;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)"
d="m 255.95883,188.01096 h 9.13809"
id="path313-7" />
<path
style="fill:none;stroke:#000000;stroke-width:0.498548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 288.61506,194.91389 v 11.30454"
id="path2422" />
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 288.61506,206.21842 h -66.6412"
id="path2424" />
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2438)"
d="m 221.97386,206.21842 v 6.02953"
id="path2428" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="244.91313"
y="208.8849"
id="text2466"><tspan
sodipodi:role="line"
id="tspan2464"
x="244.91313"
y="208.8849"
style="stroke-width:0.477691">First alive host is found</tspan></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.310603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect183-8"
width="74.385063"
height="44.878948"
x="198.58629"
y="213.85196" />
<g
id="g3349"
transform="matrix(1.0230652,0,0,1.0230652,179.05254,99.08495)"
style="stroke-width:0.261937;stroke-miterlimit:4;stroke-dasharray:none">
<path
style="fill:none;stroke:#000000;stroke-width:0.261937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 141.52464,101.28486 v 11.326"
id="path2522" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 151.34281,101.37995 v 10.83286"
id="path2524" />
<path
style="fill:none;stroke:#000000;stroke-width:0.261937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 141.52464,112.61086 c 0,0 4.62598,1.82747 8.19381,0.2982 l 1.62436,-0.69625"
id="path2528"
sodipodi:nodetypes="csc" />
<circle
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.261937;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path2590"
sodipodi:type="arc"
sodipodi:cx="146.38007"
sodipodi:cy="101.42851"
sodipodi:rx="4.9667363"
sodipodi:ry="1.2128059"
sodipodi:start="0"
sodipodi:end="6.24313"
sodipodi:arc-type="slice"
d="m 151.3468,101.42851 a 4.9667363,1.2128059 0 0 1 -4.917,1.21275 4.9667363,1.2128059 0 0 1 -5.01547,-1.18846 4.9667363,1.2128059 0 0 1 4.81655,-1.23655 4.9667363,1.2128059 0 0 1 5.11194,1.1637 l -4.96275,0.0486 z" />
<text
xml:space="preserve"
style="font-size:2.06635px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.261937;stroke-miterlimit:4;stroke-dasharray:none"
x="143.25294"
y="106.72025"
id="text2594"
transform="scale(0.99143116,1.0086429)"><tspan
sodipodi:role="line"
id="tspan2592"
x="143.25294"
y="106.72025"
style="stroke-width:0.261937;stroke-miterlimit:4;stroke-dasharray:none">RedisDB</tspan><tspan
sodipodi:role="line"
x="143.25294"
y="107.75343"
style="stroke-width:0.261937;stroke-miterlimit:4;stroke-dasharray:none"
id="tspan2596" /></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.253586;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2956)"
d="m 356.90125,197.45841 v 3.39564 h -28.09239 v 1.99891"
id="path2718" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="199.69743"
y="216.04881"
id="text3156"><tspan
sodipodi:role="line"
id="tspan3154"
x="199.69743"
y="216.04881"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691" /><tspan
sodipodi:role="line"
x="199.69743"
y="217.97824"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan5033">Prepare the the data structure </tspan><tspan
sodipodi:role="line"
x="199.69743"
y="219.90767"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan5035" /><tspan
sodipodi:role="line"
x="199.69743"
y="221.8371"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan5037">for the host attack</tspan><tspan
sodipodi:role="line"
x="199.69743"
y="222.7925"
style="font-weight:bold;stroke-width:0.477691"
id="tspan3615" /><tspan
sodipodi:role="line"
x="199.69743"
y="223.74788"
style="stroke-width:0.477691"
id="tspan3162" /><tspan
sodipodi:role="line"
x="199.69743"
y="224.70328"
style="stroke-width:0.477691"
id="tspan3164" /><tspan
sodipodi:role="line"
x="199.69743"
y="225.65866"
style="stroke-width:0.477691"
id="tspan3158" /><tspan
sodipodi:role="line"
x="199.69743"
y="226.61406"
style="stroke-width:0.477691"
id="tspan3160" /><tspan
sodipodi:role="line"
x="199.69743"
y="227.56944"
style="stroke-width:0.477691"
id="tspan3459" /></text>
<text
xml:space="preserve"
style="font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="120.7776"
y="104.68691"
id="text3463"><tspan
sodipodi:role="line"
id="tspan3461"
x="120.7776"
y="104.68691"
style="stroke-width:0.264583" /><tspan
sodipodi:role="line"
x="120.7776"
y="105.21608"
style="stroke-width:0.264583"
id="tspan3465" /><tspan
sodipodi:role="line"
x="120.7776"
y="105.74524"
style="stroke-width:0.264583"
id="tspan3467" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.413331;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3469"
width="56.108444"
height="9.5614986"
x="199.55467"
y="237.76402" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="200.60321"
y="240.83084"
id="text3473"><tspan
sodipodi:role="line"
id="tspan3471"
x="200.60321"
y="240.83084"
style="font-weight:bold;font-size:2.98787px;stroke-width:0.477691">Create new host</tspan><tspan
sodipodi:role="line"
x="200.60321"
y="241.78622"
style="stroke-width:0.477691"
id="tspan11294" /><tspan
sodipodi:role="line"
x="200.60321"
y="242.74162"
style="stroke-width:0.477691"
id="tspan11296" /><tspan
sodipodi:role="line"
x="200.60321"
y="243.69701"
style="stroke-width:0.477691"
id="tspan11298">Create a new host structure in the running hosts list.</tspan><tspan
sodipodi:role="line"
x="200.60321"
y="244.6524"
style="stroke-width:0.477691"
id="tspan3583" /><tspan
sodipodi:role="line"
x="200.60321"
y="245.60779"
style="stroke-width:0.477691"
id="tspan3585">Wait for a free slot for the new host</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491)"
d="m 250.87642,247.82393 c 19.42693,8.11028 12.00593,-7.10252 6.46349,-4.72851"
id="path3481"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="201.18391"
y="256.31506"
id="text3607"><tspan
sodipodi:role="line"
x="201.18391"
y="256.31506"
style="stroke-width:0.477691"
id="tspan3611">- Stores the data in the host's structure</tspan><tspan
sodipodi:role="line"
x="201.18391"
y="257.27045"
style="stroke-width:0.477691"
id="tspan3609" /></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.380341;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3469-6"
width="56.141438"
height="8.0913363"
x="199.5838"
y="224.55501" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;stroke-width:0.477691"
x="200.62605"
y="228.6761"
id="text3473-1"><tspan
sodipodi:role="line"
id="tspan3471-5"
x="200.62605"
y="228.6761"
style="stroke-width:0.477691">Get a new KB for the hosts. It loops until there is a free</tspan><tspan
sodipodi:role="line"
x="200.62605"
y="229.63148"
style="stroke-width:0.477691"
id="tspan3819" /><tspan
sodipodi:role="line"
x="200.62605"
y="230.58688"
style="stroke-width:0.477691"
id="tspan3821">kb for the hosts</tspan><tspan
sodipodi:role="line"
x="200.62605"
y="231.54227"
style="stroke-width:0.477691"
id="tspan3585-4" /></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491-2)"
d="m 250.89925,233.42816 c 19.42694,8.11029 12.00593,-7.10249 6.4635,-4.72852"
id="path3481-7"
sodipodi:nodetypes="cc" />
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.38228px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2438-6)"
d="m 221.44451,233.16779 v 3.86143"
id="path2428-6" />
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.40408px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2438-9)"
d="m 221.44451,248.78054 v 4.31441"
id="path2428-7" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.440381;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3469-4"
width="56.081398"
height="10.85906"
x="198.62785"
y="267.75766" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;stroke-width:0.477691"
x="199.51801"
y="271.51508"
id="text3473-7"><tspan
sodipodi:role="line"
x="199.51801"
y="271.51508"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan3585-3">Fork Host</tspan><tspan
sodipodi:role="line"
x="199.51801"
y="273.44452"
style="font-weight:bold;font-size:3.82154px;stroke-width:0.477691"
id="tspan11300" /><tspan
sodipodi:role="line"
x="199.51801"
y="274.3999"
style="stroke-width:0.477691"
id="tspan10562" /><tspan
sodipodi:role="line"
x="199.51801"
y="275.35529"
style="stroke-width:0.477691"
id="tspan10564">Fork()s the process and starts the host attack</tspan><tspan
sodipodi:role="line"
x="199.51801"
y="276.31067"
style="stroke-width:0.477691"
id="tspan4473" /><tspan
sodipodi:role="line"
x="199.51801"
y="277.26605"
style="stroke-width:0.477691"
id="tspan4475">If the fork() fails, keep trying</tspan></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491-4)"
d="m 249.91328,276.60115 c 19.42694,8.11029 12.00596,-7.10249 6.46351,-4.72851"
id="path3481-0"
sodipodi:nodetypes="cc" />
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2438-9-8)"
d="m 221.44451,259.69325 v 6.02951"
id="path2428-7-8" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="340.76785"
y="182.64168"
id="text4881"><tspan
sodipodi:role="line"
id="tspan4879"
x="340.76785"
y="182.64168"
style="font-weight:bold;stroke-width:0.477691">Boreas</tspan></text>
<path
style="fill:none;stroke:#ff0000;stroke-width:1.41159;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5173)"
d="m 238.31883,280.17607 v 5.53603 h 257.94578 v 26.97524"
id="path5163" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="422.49402"
y="276.77133"
id="text5303"><tspan
id="tspan5301"
x="422.49402"
y="276.77133"
style="font-size:10.5833px;stroke-width:0.477691"
sodipodi:role="line">fork() Host</tspan><tspan
x="422.49402"
y="277.72672"
style="font-size:12.7384px;stroke-width:0.477691"
sodipodi:role="line"
id="tspan11034" /></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.210663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect3469-4-0"
width="31.095526"
height="4.481616"
x="78.371017"
y="146.89815"
transform="matrix(1.8054507,0,0,1.8054507,56.717257,24.337355)" />
<text
xml:space="preserve"
style="font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;stroke-width:0.264583;filter:url(#filter4875)"
x="78.948311"
y="148.6516"
id="text3473-7-6"
transform="matrix(1.8054507,0,0,1.8054507,56.717257,24.337355)"><tspan
sodipodi:role="line"
x="78.948311"
y="148.6516"
style="stroke-width:0.264583"
id="tspan4475-9">Get a new host from redis, from the alive hosts list.</tspan><tspan
sodipodi:role="line"
x="78.948311"
y="149.18076"
style="stroke-width:0.264583"
id="tspan8920" /><tspan
sodipodi:role="line"
x="78.948311"
y="149.70993"
style="stroke-width:0.264583"
id="tspan8922">Keep waiting until there is an available host or the end</tspan><tspan
sodipodi:role="line"
x="78.948311"
y="150.23909"
style="stroke-width:0.264583"
id="tspan8924" /><tspan
sodipodi:role="line"
x="78.948311"
y="150.76825"
style="stroke-width:0.264583"
id="tspan8926">of the list</tspan></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491-4-6);filter:url(#filter4875)"
d="m 106.79354,151.81292 c 10.76016,4.49211 6.64983,-3.93392 3.57999,-2.61902"
id="path3481-0-4"
sodipodi:nodetypes="cc"
transform="matrix(1.8054507,0,0,1.8054507,56.717257,24.337355)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker8532)"
d="m 198.1071,293.55355 h -5.25331 v -77.2608 h 5.74516"
id="path8994" />
<path
style="fill:none;stroke:#000000;stroke-width:0.387399px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9018)"
d="m 221.44451,298.61058 v 5.13395"
id="path9008" />
<text
xml:space="preserve"
style="font-size:1.91078px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.477691"
x="224.06892"
y="302.79694"
id="text9166"><tspan
sodipodi:role="line"
id="tspan9164"
x="224.06892"
y="302.79694"
style="stroke-width:0.477691">No more alive hosts</tspan><tspan
sodipodi:role="line"
x="224.06892"
y="303.75232"
style="stroke-width:0.477691"
id="tspan9168" /></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.210663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-6)"
id="rect3469-4-0-5"
width="31.095526"
height="4.481616"
x="78.206886"
y="156.43694"
transform="matrix(1.3880746,0,0,1.2511121,89.358431,111.05626)" />
<text
xml:space="preserve"
style="font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;stroke-width:0.264583;filter:url(#filter4875-6)"
x="78.78418"
y="158.19038"
id="text3473-7-6-6"
transform="matrix(1.8054507,0,0,1.8054507,56.717257,24.337355)"><tspan
sodipodi:role="line"
x="78.78418"
y="158.19038"
style="stroke-width:0.264583"
id="tspan8926-1">Wait for the runing hosts to finish</tspan></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491-4-6-3);filter:url(#filter4875-6)"
d="m 106.62943,161.3517 c 10.76016,4.49211 6.64983,-3.93392 3.57999,-2.61902"
id="path3481-0-4-2"
sodipodi:nodetypes="cc"
transform="matrix(1.3880746,0,0,1.2511121,89.358431,111.05626)" />
<text
xml:space="preserve"
id="text9895"
style="font-size:1.05833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect9897)" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.210663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-6-1)"
id="rect3469-4-0-5-5"
width="31.095526"
height="4.481616"
x="78.206886"
y="156.43694"
transform="matrix(1.3880746,0,0,1.2511121,89.497151,123.15716)" />
<text
xml:space="preserve"
style="font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;stroke-width:0.264583;filter:url(#filter4875-6-1)"
x="84.937805"
y="165.25032"
id="text3473-7-6-6-9"
transform="matrix(1.8054507,0,0,1.8054507,56.717257,24.337355)"><tspan
sodipodi:role="line"
x="84.937805"
y="165.25032"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583"
id="tspan8926-1-8">End Scan</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10576)"
d="m 221.44451,279.93116 v 6.30767"
id="path10566" />
<path
style="fill:none;stroke:#000000;stroke-width:0.477691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10744)"
d="m 221.44451,313.23434 v 4.23975"
id="path10734" />
<path
style="fill:none;stroke:#0000ff;stroke-width:0.373483;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.373483, 0.373483;stroke-dashoffset:0;stroke-opacity:1"
d="m 328.96186,215.41924 v 76.16964 h -74.68"
id="path11302" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.323535;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect255-9-0"
width="38.117588"
height="18.724764"
x="232.79967"
y="207.17982"
ry="0"
transform="matrix(1.5987128,0,0,1.0014178,107.2541,143.34197)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875)"
x="225.25633"
y="208.92245"
id="text1778-4"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,58.362877)"><tspan
sodipodi:role="line"
id="tspan1776-4"
x="225.25633"
y="208.92245"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="225.25633"
y="210.28931"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan2098-4">Before scanning a host, </tspan><tspan
sodipodi:role="line"
x="225.25633"
y="211.65616"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4979-4" /><tspan
sodipodi:role="line"
x="225.25633"
y="213.02299"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7">some previous actions</tspan><tspan
sodipodi:role="line"
x="225.25633"
y="213.69981"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6" /><tspan
sodipodi:role="line"
x="225.25633"
y="214.37663"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514" /><tspan
sodipodi:role="line"
x="225.25633"
y="215.05345"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11516" /><tspan
sodipodi:role="line"
x="225.25633"
y="215.73026"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11518">- Set the scan id in the host kb.</tspan><tspan
sodipodi:role="line"
x="225.25633"
y="216.40707"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11520" /><tspan
sodipodi:role="line"
x="225.25633"
y="217.08389"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11522">- Stores the kb index in the list of kb that belongs to the task</tspan><tspan
sodipodi:role="line"
x="225.25633"
y="217.76071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11524" /><tspan
sodipodi:role="line"
x="225.25633"
y="218.43752"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11526">- Check host authorization</tspan><tspan
sodipodi:role="line"
x="225.25633"
y="219.11433"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11528" /><tspan
sodipodi:role="line"
x="225.25633"
y="219.79115"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11530">- Check vhost preferences</tspan><tspan
sodipodi:role="line"
x="225.25633"
y="220.46797"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11532" /><tspan
sodipodi:role="line"
x="225.25633"
y="221.14478"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11534" /><tspan
sodipodi:role="line"
x="225.25633"
y="221.82159"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.373483px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12818)"
d="m 505.65188,371.13857 v 3.55275"
id="path11716" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.323535;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-9)"
id="rect255-9-0-6"
width="38.117588"
height="18.724764"
x="232.79967"
y="207.17982"
ry="0"
transform="matrix(1.5987128,0,0,1.0014178,107.00433,168.56532)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9)"
x="225.07935"
y="226.79117"
id="text1778-4-4"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,58.362877)"><tspan
sodipodi:role="line"
id="tspan1776-4-3"
x="225.07935"
y="226.79117"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="225.07935"
y="228.15802"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0">Attack the host</tspan><tspan
sodipodi:role="line"
x="225.07935"
y="228.83484"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9" /><tspan
sodipodi:role="line"
x="225.07935"
y="229.51164"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2" /><tspan
sodipodi:role="line"
x="225.07935"
y="230.18846"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11516-5" /><tspan
sodipodi:role="line"
x="225.07935"
y="230.86528"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11518-4">- Init a vhost list, for both, existing and to be found vhosts</tspan><tspan
sodipodi:role="line"
x="225.07935"
y="231.5421"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11520-0" /><tspan
sodipodi:role="line"
x="225.07935"
y="232.2189"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11522-5">- Stores some data in the kb's (host and main)</tspan><tspan
sodipodi:role="line"
x="225.07935"
y="232.89572"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11524-9" /><tspan
sodipodi:role="line"
x="225.07935"
y="233.57254"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11530-9">- Init the plugin scheduler for the host</tspan><tspan
sodipodi:role="line"
x="225.07935"
y="234.24936"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11532-2" /><tspan
sodipodi:role="line"
x="225.07935"
y="234.92616"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11534-2" /><tspan
sodipodi:role="line"
x="225.07935"
y="235.60298"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.327795;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect12814"
width="65.803284"
height="80.66597"
x="479.31137"
y="403.03281" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0)"
x="225.06108"
y="245.84851"
id="text1778-4-4-1"
inkscape:transform-center-x="20.13519"
inkscape:transform-center-y="-8.9367838"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,58.362877)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0"
x="225.06108"
y="245.84851"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="225.06108"
y="247.21536"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5">Start plugins launch</tspan><tspan
sodipodi:role="line"
x="225.06108"
y="247.89218"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1" /><tspan
sodipodi:role="line"
x="225.06108"
y="248.56898"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2-1" /><tspan
sodipodi:role="line"
x="225.06108"
y="249.2458"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11516-5-0" /><tspan
sodipodi:role="line"
x="225.06108"
y="249.92262"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11518-4-8">- Get a plugin from the list</tspan><tspan
sodipodi:role="line"
x="225.06108"
y="250.59944"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11520-0-5" /><tspan
sodipodi:role="line"
x="225.06108"
y="251.27625"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11524-9-6">- Check that the parent is alive</tspan><tspan
sodipodi:role="line"
x="225.06108"
y="251.95306"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13504" /><tspan
sodipodi:role="line"
x="225.06108"
y="252.62988"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13506">- Check that the scan is not stopped</tspan><tspan
sodipodi:role="line"
x="225.06108"
y="253.3067"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11530-9-4" /><tspan
sodipodi:role="line"
x="225.06108"
y="253.98351"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13514" /><tspan
sodipodi:role="line"
x="225.06108"
y="254.66032"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11532-2-6" /><tspan
sodipodi:role="line"
x="225.06108"
y="255.33714"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11534-2-2" /><tspan
sodipodi:role="line"
x="225.06108"
y="256.01395"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5" /></text>
<rect
style="opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect13516"
width="43.717827"
height="9.8059444"
x="480.242"
y="408.49234" />
<path
style="fill:none;stroke:#000000;stroke-width:0.373483px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13528)"
d="m 505.65188,396.68191 v 4.9088"
id="path13518" />
<path
style="fill:none;stroke:#000000;stroke-width:0.258558px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13726)"
d="m 505.65188,419.44376 v 4.37921"
id="path13716" />
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.295573px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13726-1);filter:url(#filter4875)"
d="m 506.29911,433.30634 v 5.72281"
id="path13716-7" />
<rect
style="opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.458804;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect13938"
width="43.552975"
height="39.634949"
x="481.68799"
y="438.0773" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1)"
x="226.17502"
y="262.90002"
id="text1778-4-4-1-3"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367837"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,69.475384)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4"
x="226.17502"
y="262.90002"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="226.17502"
y="264.26688"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0">Plugin launch</tspan><tspan
sodipodi:role="line"
x="226.17502"
y="264.9437"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3" /><tspan
sodipodi:role="line"
x="226.17502"
y="265.62051"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2-1-9" /><tspan
sodipodi:role="line"
x="226.17502"
y="266.29733"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14096">It will loop here while there are plugins </tspan><tspan
sodipodi:role="line"
x="226.17502"
y="266.97412"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14098" /><tspan
sodipodi:role="line"
x="226.17502"
y="267.65094"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14100">or until the scan is stopped.</tspan><tspan
sodipodi:role="line"
x="226.17502"
y="268.32776"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14102" /><tspan
sodipodi:role="line"
x="226.17502"
y="269.00458"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14104">If there are no free slot for a plugin process</tspan><tspan
sodipodi:role="line"
x="226.17502"
y="269.6814"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14106" /><tspan
sodipodi:role="line"
x="226.17502"
y="270.35822"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan14108">it will try some times.</tspan><tspan
sodipodi:role="line"
x="226.17502"
y="271.03503"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15301" /><tspan
sodipodi:role="line"
x="226.17502"
y="271.71185"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13514-0">Periodically updates the scan progress.</tspan><tspan
sodipodi:role="line"
x="226.17502"
y="272.38864"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11532-2-6-5" /><tspan
sodipodi:role="line"
x="226.17502"
y="273.06546"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11534-2-2-6" /><tspan
sodipodi:role="line"
x="226.17502"
y="273.74228"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5-6" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.576173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker14436)"
d="m 525.3745,469.93471 h 8.90168 v -57.21493 h -10.2407"
id="path14426" />
<text
xml:space="preserve"
style="font-size:1.49392px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.373483"
x="535.38275"
y="422.55106"
id="text14644"><tspan
sodipodi:role="line"
id="tspan14642"
x="535.38275"
y="422.55106"
style="stroke-width:0.373483">next Plugin</tspan></text>
<text
xml:space="preserve"
style="font-size:1.49392px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;stroke-width:0.373483"
x="536.11829"
y="425.04858"
id="text14992"><tspan
sodipodi:role="line"
x="536.11829"
y="425.04858"
style="stroke-width:0.373483"
id="tspan1664">Try again</tspan><tspan
sodipodi:role="line"
x="536.11829"
y="425.79553"
style="stroke-width:0.373483"
id="tspan1668" /><tspan
sodipodi:role="line"
x="536.11829"
y="426.54251"
style="stroke-width:0.373483"
id="tspan1670">on error</tspan></text>
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect14994-0"
width="44.503998"
height="9.3277721"
x="223.52864"
y="311.20508"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,52.012873)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-9)"
x="224.12932"
y="312.53644"
id="text1778-4-4-1-3-2-7"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367832"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,52.012873)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-5"
x="224.12932"
y="312.53644"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.12932"
y="313.90329"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-8">Wait for running plugins </tspan><tspan
sodipodi:role="line"
x="224.12932"
y="315.27014"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan15262" /><tspan
sodipodi:role="line"
x="224.12932"
y="316.63699"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan15264">to finish</tspan><tspan
sodipodi:role="line"
x="224.12932"
y="317.31381"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-9" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.373483px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker16508)"
d="m 505.65188,484.68832 v 4.03738"
id="path15324" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.242874;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1155"
width="40.06105"
height="8.0572214"
x="482.89383"
y="455.86258" />
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.153536;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect1155-6"
width="28.398632"
height="4.542244"
x="226.15996"
y="281.33713"
transform="matrix(1.445539,0,0,1.4115852,155.83692,69.476441)" />
<text
xml:space="preserve"
id="text1396"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1398);fill:#000000;fill-opacity:1;stroke:none" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-89)"
x="226.8074"
y="274.74631"
id="text1778-4-4-1-3-6"
inkscape:transform-center-x="20.13519"
inkscape:transform-center-y="-8.9367836"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,69.475384)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-1"
x="226.8074"
y="274.74631"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="226.8074"
y="276.11316"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-29">Take a free slot</tspan><tspan
sodipodi:role="line"
x="226.8074"
y="276.78998"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-3" /><tspan
sodipodi:role="line"
x="226.8074"
y="277.4668"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11534-2-2-6-3">Wait here until there is a free slot for a</tspan><tspan
sodipodi:role="line"
x="226.8074"
y="278.14362"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1582" /><tspan
sodipodi:role="line"
x="226.8074"
y="278.8204"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1584">new plugin process</tspan><tspan
sodipodi:role="line"
x="226.8074"
y="279.49722"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5-6-2" /></text>
<rect
style="display:inline;opacity:0.994;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.242874;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect1155-67"
width="40.06105"
height="8.0572214"
x="481.88416"
y="425.97577"
transform="matrix(1.0820955,0,0,0.97686174,-39.369305,8.8732951)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-89-7)"
x="226.8074"
y="274.74631"
id="text1778-4-4-1-3-6-15"
inkscape:transform-center-x="20.13519"
inkscape:transform-center-y="-8.9367836"
transform="matrix(1.4115889,0,0,1.4115889,162.50532,38.530238)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-1-55"
x="226.8074"
y="274.74631"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="226.8074"
y="276.11316"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-29-3">Read PIPE</tspan><tspan
sodipodi:role="line"
x="226.8074"
y="276.78998"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-3-0" /><tspan
sodipodi:role="line"
x="226.8074"
y="277.4668"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5-6-2-0">Check if there is some data comming from</tspan><tspan
sodipodi:role="line"
x="226.8074"
y="278.14362"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1114" /><tspan
sodipodi:role="line"
x="226.8074"
y="278.8204"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1116">the child processes</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-89-0)"
x="226.52051"
y="282.27673"
id="text1778-4-4-1-3-6-1"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367835"
transform="matrix(1.4115889,0,0,1.4115889,163.51505,69.475384)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-1-5"
x="226.52051"
y="282.27673"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="226.52051"
y="283.64359"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-29-5">Fork or error</tspan><tspan
sodipodi:role="line"
x="226.52051"
y="284.3204"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-3-4" /><tspan
sodipodi:role="line"
x="226.52051"
y="284.99722"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5-6-2-6">Prepare everything to for a plugin process</tspan><tspan
sodipodi:role="line"
x="226.52051"
y="285.67404"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1660" /><tspan
sodipodi:role="line"
x="226.52051"
y="286.35083"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan1662" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:17.6389px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.8534"
x="324.96985"
y="30.665897"
id="text3370"><tspan
sodipodi:role="line"
id="tspan3368"
x="324.96985"
y="30.665897"
style="font-size:17.6389px;stroke-width:1.8534">Normal run loop</tspan></text>
<path
style="fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker19130)"
d="m 511.48516,473.04321 v 3.84196 h 106.73001"
id="path3408" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="628.47211"
y="477.72064"
id="text3454"><tspan
sodipodi:role="line"
id="tspan3452"
x="628.47211"
y="477.72064"
style="stroke-width:0.264583">Fork Plugin</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="304.2598"
y="461.97076"
id="text14319"><tspan
sodipodi:role="line"
x="304.2598"
y="461.97076"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan14323" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.319915;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect14834"
width="137.31358"
height="154.00496"
x="271.2269"
y="442.95328" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="273.62796"
y="448.14111"
id="text14838"><tspan
sodipodi:role="line"
id="tspan14836"
x="273.62796"
y="448.14111"
style="font-weight:bold;stroke-width:0.264583">Wait for a free slot for a new plugin</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="480.12177"
y="502.37488"
id="text14846"><tspan
sodipodi:role="line"
id="tspan14844"
x="480.12177"
y="502.37488"
style="font-size:2.11667px;stroke-width:0.264583">Update the running process status and return here</tspan></text>
<path
style="display:inline;opacity:0.994;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3491-4-6-3-4);filter:url(#filter4875-6-9)"
d="m 106.62943,161.3517 c 10.76016,4.49211 6.64983,-3.93392 3.57999,-2.61902"
id="path3481-0-4-2-2"
sodipodi:nodetypes="cc"
transform="matrix(1.3131756,-0.44980093,0.40541869,1.1836034,334.34519,361.46549)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.278492px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="m 401.35843,498.87289 h 77.34245"
id="path15426" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="429.26407"
y="496.27802"
id="text16120"><tspan
sodipodi:role="line"
id="tspan16118"
x="429.26407"
y="496.27802"
style="font-size:2.11667px;stroke-width:0.264583">Update and return</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker18080);marker-end:url(#marker17656)"
d="M 482.36464,459.03748 H 407.86676"
id="path17646" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;filter:url(#filter4875)"
x="425.64725"
y="455.36404"
id="text16120-6"><tspan
sodipodi:role="line"
id="tspan16118-8"
x="425.64725"
y="455.36404"
style="font-size:2.11667px;stroke-width:0.264583">Update and return with a free slot</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="346.62842"
y="593.97321"
id="text18558"><tspan
sodipodi:role="line"
id="tspan18556"
x="346.62842"
y="593.97321"
style="font-size:2.11667px;stroke-width:0.264583">see: pluginlaunch.c: pluginlaunch_wait_for_free_process()</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;filter:url(#filter4875)"
x="273.92673"
y="418.28381"
id="text18558-3"><tspan
sodipodi:role="line"
id="tspan18556-8"
x="273.92673"
y="418.28381"
style="font-size:2.11667px;stroke-width:0.264583" /></text>
<g
id="g27637"
transform="translate(-2.6421303,11.112501)">
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect14994-7"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(1.9107355,0,0,0.68283929,-255.84707,179.48705)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-33.685002,116.32922)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-8"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-9">Check for free available memory and idle system load</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-3" /></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker27655)"
d="m 339.60832,537.72814 v 8.10845"
id="path22671" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker27665)"
d="m 339.60832,467.96255 v 8.26116"
id="path22673" />
<g
id="g27576"
transform="translate(-1.083984,11.112501)">
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-65)"
id="rect14994-7-8"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(1.9107258,0,0,0.99992631,-257.40218,-79.57358)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-6)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-7"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-34.22051,22.900345)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-8-9"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-9-6">Return inmediately if there is a free slot</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-0" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-3-4" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;filter:url(#filter4875-93)"
x="283.10916"
y="452.42502"
id="text18558-33-2"><tspan
sodipodi:role="line"
id="tspan18556-3-8"
x="283.10916"
y="452.42502"
style="font-size:2.11667px;stroke-width:0.264583">Otherwise continues looping</tspan></text>
</g>
<g
id="g27651"
transform="translate(2.6425732,11.112501)">
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-3)"
id="rect14994-7-89"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(1.9107214,0,0,1.1614009,-261.12736,-50.662507)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-1)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-1"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-36.535996,137.00854)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-8-5"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-9-4">Wait until a plugins child finishes or timeouts.</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-9" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-3-2" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;filter:url(#filter4875-99)"
x="280.16666"
y="565.17145"
id="text18558-33-5"><tspan
sodipodi:role="line"
x="280.16666"
y="565.17145"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan25493">This routines works with interruptions. Handles mainly the timeout and the SIGCHLD signal.</tspan><tspan
sodipodi:role="line"
x="280.16666"
y="566.2298"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan25489" /><tspan
sodipodi:role="line"
x="280.16666"
y="567.28815"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan25511">But also, it handles signal SIGUSR1 used to stop a scan. Otherwise the stop signal would be</tspan><tspan
sodipodi:role="line"
x="280.16666"
y="568.34644"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan25521" /><tspan
sodipodi:role="line"
x="280.16666"
y="569.40479"
style="font-size:2.11667px;stroke-width:0.264583"
id="tspan25519">ignored, the plugin is never stopped and the scanner keeps waiting.</tspan></text>
</g>
<g
id="g27629"
transform="translate(-2.2034564,11.112501)">
<g
id="g27566">
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.107;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect13523"
width="118.91256"
height="57.941761"
x="282.3555"
y="466.61285" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="283.65073"
y="472.3024"
id="text14842"><tspan
sodipodi:role="line"
id="tspan14840"
x="283.65073"
y="472.3024"
style="font-weight:bold;stroke-width:0.264583">Update the status of all running plugins</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583;filter:url(#filter4875)"
x="348.09662"
y="523.45026"
id="text18558-33"><tspan
sodipodi:role="line"
id="tspan18556-3"
x="348.09662"
y="523.45026"
style="font-size:2.11667px;stroke-width:0.264583">see: pluginlaunch.c: update_running_processes()</tspan></text>
<g
id="g25890"
transform="translate(9.3727874)">
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-35)"
id="rect14994-7-9"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(1.3930873,0,0,0.68802539,-105.20403,114.89063)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-8)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-9"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-28.81523,54.442313)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-8-7"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.74579"
style="font-weight:normal;font-size:2.99898px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-9-8">Check if the plugins is dead or timeouts</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="302.26135"
style="font-weight:normal;font-size:2.99898px;stroke-width:0.338407"
id="tspan25707" /><tspan
sodipodi:role="line"
x="224.29597"
y="303.01251"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25709">It calculates here how long a plugin has run</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.68933"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-2" /><tspan
sodipodi:role="line"
x="224.29597"
y="304.36615"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-3-5" /></text>
</g>
<g
id="g25880">
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-35-3)"
id="rect14994-7-9-2"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(0.83731393,0,0,0.98420275,50.51073,-24.793876)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.999662px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-8-9)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-9-0"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-29.367819,69.51556)"><tspan
sodipodi:role="line"
x="224.29597"
y="299.23022"
style="font-weight:bold;font-size:1.49949px;stroke-width:0.338407"
id="tspan25674">On timeout</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="299.98486"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25711" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.73947"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25713">If the hearbeat is enabled, check if the plugin is</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.49411"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25715" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.24872"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25687">still alive if there are to many NVT timeouts.</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.00336"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25699" /><tspan
sodipodi:role="line"
x="224.29597"
y="303.758"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25701">This reduce the scan time for host which died</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="304.5126"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25703" /><tspan
sodipodi:role="line"
x="224.29597"
y="305.26724"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25705">during the scan.</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="306.02185"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25697" /><tspan
sodipodi:role="line"
x="224.29597"
y="306.5217"
style="font-size:0.999662px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-2-6" /><tspan
sodipodi:role="line"
x="224.29597"
y="307.02151"
style="font-size:0.999662px;stroke-width:0.338407"
id="tspan15190-3-5-2" /></text>
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-35-3-1)"
id="rect14994-7-9-2-3"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(0.83731393,0,0,0.98420275,105.76262,-24.77425)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.999662px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-8-9-0)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-9-0-1"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,25.884064,69.535186)"><tspan
sodipodi:role="line"
x="224.29597"
y="299.23022"
style="font-weight:bold;font-size:1.49949px;stroke-width:0.338407"
id="tspan25674-1">Plugin is dead --&gt; finished</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="299.98486"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25711-9" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.73947"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25697-6">The plugin has already finished and it is a </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.49411"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25848" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.24872"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25844">zombie process waiting for its parent.</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.00336"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25846" /><tspan
sodipodi:role="line"
x="224.29597"
y="303.50317"
style="font-size:0.999662px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-2-6-4" /><tspan
sodipodi:role="line"
x="224.29597"
y="304.00302"
style="font-size:0.999662px;stroke-width:0.338407"
id="tspan15190-3-5-2-7" /></text>
</g>
<rect
style="display:inline;opacity:0.98903;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-35-1)"
id="rect14994-7-9-7"
width="62.821346"
height="13.16698"
x="281.60886"
y="522.39117"
transform="matrix(1.3930845,0,0,0.78794761,-95.830366,95.785102)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.988036;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-0-8-1)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-6-9-2"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,-19.442435,87.006124)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-8-7-6"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.74579"
style="font-weight:normal;font-size:2.99898px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-9-8-4">Updates the plugin process table</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.49695"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan25709-2" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.24811"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan26024" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.9993"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan27514">Removes the finished plugins from the table. There is now a free slot or the table</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.75046"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan26032" /><tspan
sodipodi:role="line"
x="224.29597"
y="304.50162"
style="font-weight:normal;font-size:1.49949px;stroke-width:0.338407"
id="tspan26034">is empty when the scan finished.</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="305.17844"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-0-2-0" /><tspan
sodipodi:role="line"
x="224.29597"
y="305.85526"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-3-5-29" /></text>
</g>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker27665)"
d="m 339.44009,558.39694 v 6.55831"
id="path28495" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker31403)"
d="m 279.68998,574.75743 h -6.21625 V 459.66757 h 5.31233"
id="path28929" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 338.09037,494.60082 v 3.10949 l 0.0527,-0.0143"
id="path28931" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#marker29555)"
d="m 325.75656,500.30799 v -2.69655 h 22.97292 v 2.78968"
id="path28933" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker30487)"
d="m 325.64218,513.57997 v 4.27887"
id="path30477" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker30943)"
d="m 349.82142,513.71961 v 4.19704"
id="path30933" />
<path
style="fill:none;stroke:#000000;stroke-width:0.221542px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker31403)"
d="m 505.24075,433.31449 v 4.01233"
id="path3998" />
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875)"
id="rect14994"
width="62.821346"
height="13.16698"
x="332.38638"
y="377.94687" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,17.863588,-42.564036)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2">Run the LSC (Notus)</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2-1-9-9" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.62753"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13506-3-6" /><tspan
sodipodi:role="line"
x="224.29597"
y="303.30432"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2000-9-4-5-6-4">If the LSC is enabled, the scanner communicates via MQTT </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.98114"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15184" /><tspan
sodipodi:role="line"
x="224.29597"
y="304.65796"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15186">with the notus scanner and send the necesary information to </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="305.33478"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15188" /><tspan
sodipodi:role="line"
x="224.29597"
y="306.0116"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190">start a LSC scan.</tspan></text>
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-32)"
id="rect14994-9"
width="62.821346"
height="13.16698"
x="332.38638"
y="393.35306" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-4)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-3"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,17.863588,-27.157725)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-6"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-0">Update User-Agent </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-9" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2-1-9-9-2" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.62753"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan13506-3-6-3" /><tspan
sodipodi:role="line"
x="224.29597"
y="303.30432"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-4">The User Agent is set from a plugin and communicated to the</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.98114"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan41483" /><tspan
sodipodi:role="line"
x="224.29597"
y="304.65796"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan41485">parent process. so further plugins have direct access to the </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="305.33478"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan41487" /><tspan
sodipodi:role="line"
x="224.29597"
y="306.0116"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan41489">User-Agent globally set.</tspan></text>
<rect
style="display:inline;opacity:0.995;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.282317;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4875-4)"
id="rect14994-72"
width="62.821346"
height="13.16698"
x="332.38638"
y="408.54767" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-7)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-5"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,17.863588,-11.963082)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-7"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan4981-7-0-5-0-2-2">Update vHost list</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="301.2739"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan2094-6-9-1-3-9-95" /><tspan
sodipodi:role="line"
x="224.29597"
y="301.95071"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan11514-2-1-9-9-3" /><tspan
sodipodi:role="line"
x="224.29597"
y="302.62753"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan15190-0">If a plugin found a vHost, e.g. via a TLS certificate, it is </tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.30432"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan43113"></tspan><tspan
sodipodi:role="line"
x="224.29597"
y="303.98114"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan43115">communicted to the parent process, so further plugins known</tspan><tspan
sodipodi:role="line"
x="224.29597"
y="304.65796"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan43117" /><tspan
sodipodi:role="line"
x="224.29597"
y="305.33478"
style="font-size:1.35363px;stroke-width:0.338407"
id="tspan43119">and test all vHosts.</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264583"
id="rect4433"
width="82.483963"
height="62.330177"
x="322.55508"
y="366.54346" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.35363px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.994;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.338407;filter:url(#filter4875-9-0-1-8-3)"
x="224.29597"
y="299.23022"
id="text1778-4-4-1-3-2-0"
inkscape:transform-center-x="20.135191"
inkscape:transform-center-y="-8.9367833"
transform="matrix(1.4115889,0,0,1.4115889,7.7341252,-53.253486)"><tspan
sodipodi:role="line"
id="tspan1776-4-3-0-4-8-2"
x="224.29597"
y="299.23022"
style="font-size:1.35363px;stroke-width:0.338407" /><tspan
sodipodi:role="line"
x="224.29597"
y="300.59708"
style="font-weight:bold;font-size:2.70726px;stroke-width:0.338407"
id="tspan59549">Messages from child process</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#marker31403)"
d="m 482.09027,429.00361 -43.04162,-0.28868 V 371.0202 h -32.17674"
id="path67942" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Slide 3"
style="display:none">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:17.6389px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="277.68768"
y="30.265678"
id="text3462"><tspan
sodipodi:role="line"
id="tspan3460"
x="277.68768"
y="30.265678"
style="font-size:17.6389px;stroke-width:0.264583">Scanner stop mechanism</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.498825"
y="96.017769"
id="text3472"><tspan
sodipodi:role="line"
x="87.498825"
y="96.017769"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3474">A new process scanner is started, but this time with the --stop-scan=scan _id</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="98.165436"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3478">command line option.</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="100.31311"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3480">The scan_id is the same as the scan task you want to stop.</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="102.46078"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3508">This new scan process runs as root user, and therefore can send an interruption</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="104.60845"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3512">signal to other process running as root user.</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="106.75612"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3514" /></text>
<text
xml:space="preserve"
id="text3482"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect3484);fill:#000000;fill-opacity:1;stroke:none" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.618283;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488"
width="95.621803"
height="21.413193"
x="85.661102"
y="86.824905" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.080246"
y="92.066055"
id="text3492"><tspan
sodipodi:role="line"
id="tspan3490"
x="87.080246"
y="92.066055"
style="stroke-width:0.264583">Run openvas --scan-stop=&lt;scan_id&gt;</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="39.796276"
y="72.558441"
id="text3518"><tspan
sodipodi:role="line"
id="tspan3516"
x="39.796276"
y="72.558441"
style="stroke-width:0.264583" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="58.675583"
y="75.919724"
id="text3522"><tspan
sodipodi:role="line"
id="tspan3520"
x="58.675583"
y="75.919724"
style="font-size:10.5833px;stroke-width:0.264583">Start the stop process</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.498825"
y="132.1264"
id="text3472-3"><tspan
sodipodi:role="line"
x="87.498825"
y="132.1264"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3514-4">Every running scan task has Main KB in redis, where results and internal task's data is stored.</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="134.27408"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3622">This new scan process goes through all redis kbs until the kb is found.</tspan><tspan
sodipodi:role="line"
x="87.498825"
y="136.42174"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3624">The identifier number of the KB is stored. </tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.616054;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-7"
width="94.923622"
height="21.415422"
x="86.010193"
y="122.93242" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.216675"
y="128.1747"
id="text3492-4"><tspan
sodipodi:role="line"
id="tspan3490-4"
x="87.216675"
y="128.1747"
style="stroke-width:0.264583">Search for the given scan_id in all redis KBs</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.498825"
y="167.83842"
id="text3472-3-3"><tspan
sodipodi:role="line"
x="87.498825"
y="167.83842"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3624-8">The openvas PID of the scan task process .is stored in main kb found before, under the key &quot;internal/ovas_pid&quot;. </tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.462086;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-7-6"
width="95.077591"
height="12.029038"
x="85.933205"
y="158.56746" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.258018"
y="163.88672"
id="text3492-4-8"><tspan
sodipodi:role="line"
id="tspan3490-4-8"
x="87.258018"
y="163.88672"
style="stroke-width:0.264583">Get the PID of the scan task to be stopped</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.460587"
y="193.75624"
id="text3472-3-3-4"><tspan
sodipodi:role="line"
x="87.460587"
y="193.75624"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3624-8-3">With the right permissions and the PID of the main task process to be stopped, with send the SIGUSR1 signal not only to the main process, but to the process group.</tspan><tspan
sodipodi:role="line"
x="87.460587"
y="195.90392"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3711">Main scan process and all hosts process will receive the signal to start the stop process.</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.462086;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-7-6-1"
width="95.077591"
height="12.029038"
x="85.933205"
y="184.48528" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.216675"
y="189.80453"
id="text3492-4-8-4"><tspan
sodipodi:role="line"
id="tspan3490-4-8-9"
x="87.216675"
y="189.80453"
style="stroke-width:0.264583">Stop the process</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956)"
d="m 131.67597,109.98348 v 10.90228"
id="path4946" />
<path
style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956-6)"
d="m 131.67597,145.6325 v 10.90228"
id="path4946-4" />
<path
style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956-9)"
d="m 131.67597,172.06534 v 10.90228"
id="path4946-0" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5882;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect6169"
width="159.74348"
height="147.78844"
x="56.427216"
y="58.255833" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="336.6571"
y="244.71625"
id="text3472-7"><tspan
sodipodi:role="line"
x="336.6571"
y="244.71625"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3512-0">The global_stop_scan is a variable that is check many times in different parts of the code. The main process only set the variable during the interruption and does not perform</tspan><tspan
sodipodi:role="line"
x="336.6571"
y="246.86392"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8441">any other task. This is for avoiding deadlocks or segmentation faults. As a rule, an interruption must be as short as possible.</tspan><tspan
sodipodi:role="line"
x="336.6571"
y="249.01158"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3514-6" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.493568;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1"
width="95.746521"
height="13.628092"
x="335.12946"
y="235.46101" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="347.30777"
y="240.76454"
id="text3492-5"><tspan
sodipodi:role="line"
id="tspan3490-9"
x="347.30777"
y="240.76454"
style="stroke-width:0.264583">Set the global_stop_scan variable </tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="306.6188"
y="221.44324"
id="text3522-4"><tspan
sodipodi:role="line"
id="tspan3520-9"
x="306.6188"
y="221.44324"
style="font-size:10.5833px;stroke-width:0.264583">Main Process</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="356.17883"
y="269.44913"
id="text3492-4-1"><tspan
sodipodi:role="line"
id="tspan3490-4-1"
x="356.17883"
y="269.44913"
style="stroke-width:0.264583">Check if the scan was stops</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956-4)"
d="m 383.00272,250.68767 v 10.90228"
id="path4946-9" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.565173;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect6169-1"
width="159.76651"
height="136.42406"
x="304.35895"
y="206.94276" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="508.68851"
y="219.68837"
id="text3522-4-1"><tspan
sodipodi:role="line"
id="tspan3520-9-5"
x="508.68851"
y="219.68837"
style="font-size:10.5833px;stroke-width:0.264583">Host Processes</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956-4-2)"
d="m 549.13863,244.70364 v 10.90228"
id="path4946-9-9" />
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.478221;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect6169-1-1"
width="127.55664"
height="122.33986"
x="488.39737"
y="207.19511" />
<path
style="fill:none;stroke:#008000;stroke-width:0.701022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7947)"
d="m 181.21898,190.57241 h 369.8227 v 8.87911"
id="path7589" />
<path
style="fill:none;stroke:#008000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7601)"
d="m 379.98658,190.41518 v 11.76213"
id="path7591" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:7.05556px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="222.53975"
y="186.72858"
id="text8425"><tspan
sodipodi:role="line"
id="tspan8423"
x="222.53975"
y="186.72858"
style="font-size:7.05556px;stroke-width:0.264583">SIGUSR1 signal</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.493568;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-7"
width="95.746521"
height="13.628092"
x="501.2659"
y="229.56612" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="502.37216"
y="238.78554"
id="text3472-7-8"><tspan
sodipodi:role="line"
x="502.37216"
y="238.78554"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3512-0-5">The global_stop_scan is a variable that is check many times in different parts of the code. The host processes only set the variable during the interruption and does not perform</tspan><tspan
sodipodi:role="line"
x="502.37216"
y="240.93321"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8441-7">any other task. This is for avoiding deadlocks or segmentation faults. As a rule, an interruption must be as short as possible.</tspan><tspan
sodipodi:role="line"
x="502.37216"
y="243.08087"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3514-6-4" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="513.44415"
y="234.83383"
id="text3492-5-1"><tspan
sodipodi:role="line"
id="tspan3490-9-8"
x="513.44415"
y="234.83383"
style="stroke-width:0.264583">Set the global_stop_scan variable </tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.565279;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8521"
width="153.03154"
height="50.686668"
x="307.0618"
y="264.13141" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="310.6214"
y="281.18112"
id="text3472-7-5"><tspan
sodipodi:role="line"
x="310.6214"
y="281.18112"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan3514-6-3">After the Boreas thread has started, the scanner keep waiting for the first alive host. </tspan><tspan
sodipodi:role="line"
x="310.6214"
y="283.3288"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8576">If the scan is stopped, the code leaves the routine, and the scan finishes without</tspan><tspan
sodipodi:role="line"
x="310.6214"
y="285.47647"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8574">scanning code.</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.379894;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-8"
width="46.019939"
height="16.79739"
x="309.48563"
y="276.28348" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="310.53073"
y="278.96106"
id="text3492-5-8"><tspan
sodipodi:role="line"
id="tspan3490-9-3"
x="310.53073"
y="278.96106"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">While waiting for the first alive host</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="360.82486"
y="281.18112"
id="text3472-7-5-1"><tspan
sodipodi:role="line"
x="360.82486"
y="281.18112"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8574-6">While there are alive hosts, the main scan process keep looping and forking new</tspan><tspan
sodipodi:role="line"
x="360.82486"
y="283.3288"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8631">host processes in the mean there are available host process slots.</tspan><tspan
sodipodi:role="line"
x="360.82486"
y="285.47647"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8633">If during this routine the scan is stopped, no new host process will be forked</tspan><tspan
sodipodi:role="line"
x="360.82486"
y="287.62415"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8635">and main process enters into a new routine and waits for running hosts to finish.</tspan><tspan
sodipodi:role="line"
x="360.82486"
y="289.77179"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8639">Also, sends periodically the stop signal to the host processes, in case for some </tspan><tspan
sodipodi:role="line"
x="360.82486"
y="291.91946"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8641">reason they didn't cached it before.</tspan><tspan
sodipodi:role="line"
x="360.82486"
y="294.06714"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8637" /></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.383076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-8-4"
width="46.016754"
height="17.081219"
x="360.21985"
y="276.14157" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="360.73419"
y="278.96106"
id="text3492-5-8-3"><tspan
sodipodi:role="line"
id="tspan3490-9-3-3"
x="360.73419"
y="278.96106"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">While preparing and forking hosts</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="412.77759"
y="281.18112"
id="text3472-7-5-1-3"><tspan
sodipodi:role="line"
x="412.77759"
y="281.18112"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8637-8">As well as hosts processes wait for plugin processes to finish, the main process</tspan><tspan
sodipodi:role="line"
x="412.77759"
y="283.3288"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8730">waits for all running hosts process.</tspan><tspan
sodipodi:role="line"
x="412.77759"
y="285.47647"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8732">The main scanner keeps a list of running host processes and goes through this list</tspan><tspan
sodipodi:role="line"
x="412.77759"
y="287.62415"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8734">where the host PID is stored, and check if the host process is still alive.</tspan><tspan
sodipodi:role="line"
x="412.77759"
y="289.77179"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8736">While the host are found dead, the main process cleans up the list until there are</tspan><tspan
sodipodi:role="line"
x="412.77759"
y="291.91946"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8738">no more host to check.</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.383076;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-8-4-9"
width="46.016754"
height="17.081219"
x="412.17258"
y="276.14157" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="412.68692"
y="278.96106"
id="text3492-5-8-3-7"><tspan
sodipodi:role="line"
id="tspan3490-9-3-3-7"
x="412.68692"
y="278.96106"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">Waiting for hosts to finish</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="354.19522"
y="303.59555"
id="text3472-7-5-6"><tspan
sodipodi:role="line"
x="354.19522"
y="303.59555"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8787">Each time that the global_stop_scan variable is checked, the scanner enters to a routine to cleanup the scan.</tspan><tspan
sodipodi:role="line"
x="354.19522"
y="305.74323"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8793">This routine check if it is a host process, or a main process via the PID process stored in the KB, </tspan><tspan
sodipodi:role="line"
x="354.19522"
y="307.8909"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8795">In the main process, it checks if the Boreas thread is still running and ensure it is closed gracefully.</tspan><tspan
sodipodi:role="line"
x="354.19522"
y="310.03857"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8797">Also, will sends the SIGUSR1 signal to all running host processes, again.</tspan><tspan
sodipodi:role="line"
x="354.19522"
y="312.18622"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8791" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="364.49033"
y="301.37549"
id="text3492-5-8-30"><tspan
sodipodi:role="line"
id="tspan3490-9-3-9"
x="364.49033"
y="301.37549"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">Better call scan_stop_cleanup()</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8780"
width="60.274433"
height="13.8065"
x="352.99695"
y="298.55524" />
<path
style="fill:none;stroke:#000000;stroke-width:0.20364px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 342.92936,293.14171 v 1.62169 h 78.23368 v -1.44998"
id="path8799" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker8811)"
d="m 382.8314,293.15232 v 4.54491"
id="path8801" />
<circle
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path9163"
sodipodi:type="arc"
sodipodi:cx="382.82617"
sodipodi:cy="294.8385"
sodipodi:rx="0.28756779"
sodipodi:ry="0.28756779"
sodipodi:start="0"
sodipodi:end="6.24313"
sodipodi:arc-type="slice"
d="m 383.11374,294.8385 a 0.28756779,0.28756779 0 0 1 -0.28469,0.28755 0.28756779,0.28756779 0 0 1 -0.29039,-0.28179 0.28756779,0.28756779 0 0 1 0.27887,-0.2932 0.28756779,0.28756779 0 0 1 0.29598,0.27593 l -0.28734,0.0115 z" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="352.80814"
y="334.10794"
id="text3472-7-5-6-2"><tspan
sodipodi:role="line"
x="352.80814"
y="334.10794"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8797-5">Once all hosts finished, the main process ends the clean up for the main process and set the scan status as finihsed</tspan><tspan
sodipodi:role="line"
x="352.80814"
y="336.25562"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8791-9" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="367.99783"
y="331.88788"
id="text3492-5-8-30-4"><tspan
sodipodi:role="line"
id="tspan3490-9-3-9-6"
x="367.99783"
y="331.88788"
style="font-weight:normal;font-size:4.23333px;stroke-width:0.264583">Finish the scan</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.169998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8780-9"
width="64.004745"
height="13.801502"
x="351.77328"
y="325.97482" />
<path
style="fill:none;stroke:#000000;stroke-width:0.427405;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.9;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4956-4-7)"
d="m 383.77568,315.39644 v 9.21066"
id="path4946-9-5" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="523.31183"
y="264.57309"
id="text3492-4-1-8"><tspan
sodipodi:role="line"
id="tspan3490-4-1-9"
x="523.31183"
y="264.57309"
style="stroke-width:0.264583">Check if the scan was stops</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.55536;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8521-3"
width="115.15355"
height="65.016006"
x="494.89926"
y="259.2742" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="502.62558"
y="276.30527"
id="text3472-7-5-68"><tspan
sodipodi:role="line"
x="502.62558"
y="276.30527"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8574-1">While the host process is looping in the plugins scheduler,it will check if the scan</tspan><tspan
sodipodi:role="line"
x="502.62558"
y="278.45294"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11469">was stopped to avoid storing results/status/scan progrees messages,</tspan><tspan
sodipodi:role="line"
x="502.62558"
y="280.60062"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11477">and to stop the plugin scheduler.</tspan><tspan
sodipodi:role="line"
x="502.62558"
y="282.74829"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11523">Just before launching the plugin, it checks again if the scan is stopped. Given the </tspan><tspan
sodipodi:role="line"
x="502.62558"
y="284.89594"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11607">case, it will set the plugin status as DONE without launch it.</tspan><tspan
sodipodi:role="line"
x="502.62558"
y="287.04361"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11665">It jumps out from the plugins scheduler loop and will wait for running plugins </tspan><tspan
sodipodi:role="line"
x="502.62558"
y="289.19128"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11475">to finish.</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.403685;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-8-0"
width="45.996147"
height="18.977022"
x="501.50174"
y="271.41943" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="589.99963"
y="276.15118"
id="text3472-7-5-1-3-6"><tspan
sodipodi:role="line"
x="589.99963"
y="276.15118"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8738-4" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="502.68716"
y="273.74695"
id="text3492-5-8-3-7-6"><tspan
sodipodi:role="line"
id="tspan3490-9-3-3-7-2"
x="502.68716"
y="273.74695"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">During the plugin launch</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="556.33942"
y="276.298"
id="text3472-7-5-68-3"><tspan
sodipodi:role="line"
x="556.33942"
y="276.298"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan8574-1-8">Each time that the global_stop_scan variable is checked, the scanner enters to a</tspan><tspan
sodipodi:role="line"
x="556.33942"
y="278.44568"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11475-6">routine to cleanup the scan. This routine check if it is a host process, or a main</tspan><tspan
sodipodi:role="line"
x="556.33942"
y="280.59335"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11599">process via the PID process stored in the KB.</tspan><tspan
sodipodi:role="line"
x="556.33942"
y="282.74103"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11603">For a host process, it will call pluginlaunch_stop(), to start the process of killing the </tspan><tspan
sodipodi:role="line"
x="556.33942"
y="284.88867"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan11605">childs process running a plugin.</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.403555;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3488-1-8-0-4"
width="45.996281"
height="18.964714"
x="555.21545"
y="271.41211" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="556.401"
y="273.73969"
id="text3492-5-8-3-7-6-0"><tspan
sodipodi:role="line"
id="tspan3490-9-3-3-7-2-0"
x="556.401"
y="273.73969"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">During the scan_stop_cleanup</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="521.98431"
y="300.63525"
id="text3472-7-5-6-8"><tspan
sodipodi:role="line"
x="521.98431"
y="300.63525"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12669">When a plugin process is created, it becomes a process group leader. Also, a plugin process can fork() as well</tspan><tspan
sodipodi:role="line"
x="521.98431"
y="302.78293"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12655">to be run against different ports or vhosts for the same hosts.</tspan><tspan
sodipodi:role="line"
x="521.98431"
y="304.9306"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12657">The function to stop the running plugins goes through a list of process. This list stores, among other plugin</tspan><tspan
sodipodi:role="line"
x="521.98431"
y="307.07828"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12659">information, the PID. So, killing the Negative value of the PID (-PID) , it will send the signal to the whole</tspan><tspan
sodipodi:role="line"
x="521.98431"
y="309.22592"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12661">process group.</tspan><tspan
sodipodi:role="line"
x="521.98431"
y="311.3736"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12665">In the mean that plugins are killed, the host processes die as well. </tspan><tspan
sodipodi:role="line"
x="521.98431"
y="313.52127"
style="font-size:1.05833px;stroke-width:0.264583"
id="tspan12663" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.11667px;line-height:0.5;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="531.25275"
y="297.78616"
id="text3492-5-8-30-2"><tspan
sodipodi:role="line"
id="tspan3490-9-3-9-7"
x="531.25275"
y="297.78616"
style="font-weight:bold;font-size:2.11667px;stroke-width:0.264583">Better call pluginlaunch_stop()</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.215244;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8780-6"
width="60.224186"
height="23.514618"
x="520.88617"
y="295.02051" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 547.80866,281.70515 h 7.41479"
id="path12675" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12687)"
d="m 551.7868,281.84969 v 11.8591"
id="path12677" />
</g>
<ns1:mousehandler
ns1:subtype="jessyInk_core_mouseHandler_zoomControl">
<script>// Copyright 2008, 2009 Hannes Hochreiner
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/.
// Add event listener for initialisation.
document.addEventListener(&quot;DOMContentLoaded&quot;, jessyInk_core_mouseHandler_zoomControl_init, false);
/** Initialisation function.
*
* This function looks for the objects of the appropriate sub-type and hands them to another function that will add the required methods.
*/
function jessyInk_core_mouseHandler_zoomControl_init()
{
var elems = document.getElementsByTagNameNS(&quot;https://launchpad.net/jessyink&quot;, &quot;mousehandler&quot;);
for (var counter = 0; counter &lt; elems.length; counter++)
{
if (elems[counter].getAttributeNS(&quot;https://launchpad.net/jessyink&quot;, &quot;subtype&quot;) == &quot;jessyInk_core_mouseHandler_zoomControl&quot;)
jessyInk_core_mouseHandler_zoomControl(elems[counter]);
}
}
/** Function to initialise an object.
*
* @param obj Object to be initialised.
*/
function jessyInk_core_mouseHandler_zoomControl(obj)
{
// Last dragging position.
obj.dragging_last;
// Flag to indicate whether dragging is active currently.
obj.dragging_active = false;
// Flag to indicate whether dragging is working currently.
obj.dragging_working = false;
// Flag to indicate whether the user clicked.
obj.click = false;
/** Function supplying a custom mouse handler.
*
* @returns A dictionary containing the new mouse handler functions.
*/
obj.getMouseHandler = function ()
{
var handlerDictio = new Object();
handlerDictio[SLIDE_MODE] = new Object();
handlerDictio[SLIDE_MODE][MOUSE_DOWN] = obj.mousedown;
handlerDictio[SLIDE_MODE][MOUSE_MOVE] = obj.mousemove;
handlerDictio[SLIDE_MODE][MOUSE_UP] = obj.mouseup;
handlerDictio[SLIDE_MODE][MOUSE_WHEEL] = obj.mousewheel;
return handlerDictio;
}
/** Event handler for mouse clicks.
*
* @param e Event object.
*/
obj.mouseclick = function (e)
{
var elem = obj.getAdHocViewBbox(slides[activeSlide][&quot;viewGroup&quot;], obj.getCoords(e));
processingEffect = true;
effectArray = new Array();
effectArray[0] = new Object();
effectArray[0][&quot;effect&quot;] = &quot;view&quot;;
effectArray[0][&quot;dir&quot;] = 1;
effectArray[0][&quot;element&quot;] = slides[activeSlide][&quot;viewGroup&quot;];
effectArray[0][&quot;options&quot;] = new Object();
effectArray[0][&quot;options&quot;][&quot;length&quot;] = 200;
if (elem == null)
effectArray[0][&quot;options&quot;][&quot;matrixNew&quot;] = (new matrixSVG()).fromSVGElements(1, 0, 0, 1, 0, 0);
else
effectArray[0][&quot;options&quot;][&quot;matrixNew&quot;] = obj.pointMatrixToTransformation(obj.rectToMatrix(elem)).mult((new matrixSVG()).fromSVGMatrix(slides[activeSlide].viewGroup.getScreenCTM()).inv().mult((new matrixSVG()).fromSVGMatrix(elem.parentNode.getScreenCTM())).inv());
transCounter = 0;
startTime = (new Date()).getTime();
lastFrameTime = null;
effect(1);
return false;
}
/** Function to search for the element the user clicked on.
*
* This function searches for the element with the highest z-order, which encloses the point the user clicked on
* and which view box fits entierly into the currently visible part of the slide.
*
* @param elem Element to start the search from.
* @param pnt Point where the user clicked.
* @returns The element the user clicked on or null, if no element could be found.
*/
obj.getAdHocViewBbox = function (elem, pnt)
{
var children = elem.childNodes;
for (var counter = 0; counter &lt; children.length; counter++)
{
if (children[counter].getBBox)
{
var childPointList = obj.projectRect(children[counter].getBBox(), children[counter].getScreenCTM());
var viewBbox = document.documentElement.createSVGRect();
viewBbox.x = 0.0;
viewBbox.y = 0.0;
viewBbox.width = WIDTH;
viewBbox.height = HEIGHT;
var screenPointList = obj.projectRect(viewBbox, slides[activeSlide][&quot;element&quot;].getScreenCTM());
if (obj.pointsWithinRect([pnt], childPointList) &amp;&amp; obj.pointsWithinRect(childPointList, screenPointList))
return children[counter];
child = obj.getAdHocViewBbox(children[counter], pnt);
if (child != null)
return child;
}
}
return null;
}
/** Function to project a rectangle using the projection matrix supplied.
*
* @param rect The rectangle to project.
* @param projectionMatrix The projection matrix.
* @returns A list of the four corners of the projected rectangle starting from the upper left corner and going counter-clockwise.
*/
obj.projectRect = function (rect, projectionMatrix)
{
var pntUL = document.documentElement.createSVGPoint();
pntUL.x = rect.x;
pntUL.y = rect.y;
pntUL = pntUL.matrixTransform(projectionMatrix);
var pntLL = document.documentElement.createSVGPoint();
pntLL.x = rect.x;
pntLL.y = rect.y + rect.height;
pntLL = pntLL.matrixTransform(projectionMatrix);
var pntUR = document.documentElement.createSVGPoint();
pntUR.x = rect.x + rect.width;
pntUR.y = rect.y;
pntUR = pntUR.matrixTransform(projectionMatrix);
var pntLR = document.documentElement.createSVGPoint();
pntLR.x = rect.x + rect.width;
pntLR.y = rect.y + rect.height;
pntLR = pntLR.matrixTransform(projectionMatrix);
return [pntUL, pntLL, pntUR, pntLR];
}
/** Function to determine whether all the points supplied in a list are within a rectangle.
*
* @param pnts List of points to check.
* @param pointList List of points representing the four corners of the rectangle.
* @return True, if all points are within the rectangle; false, otherwise.
*/
obj.pointsWithinRect = function (pnts, pointList)
{
var pntUL = pointList[0];
var pntLL = pointList[1];
var pntUR = pointList[2];
var matrixOrig = (new matrixSVG()).fromElements(pntUL.x, pntLL.x, pntUR.x, pntUL.y, pntLL.y, pntUR.y, 1, 1, 1);
var matrixProj = (new matrixSVG()).fromElements(0, 0, 1, 0, 1, 0, 1, 1, 1);
var matrixProjection = matrixProj.mult(matrixOrig.inv());
for (var blockCounter = 0; blockCounter &lt; Math.ceil(pnts.length / 3.0); blockCounter++)
{
var subPnts = new Array();
for (var pntCounter = 0; pntCounter &lt; 3.0; pntCounter++)
{
if (blockCounter * 3.0 + pntCounter &lt; pnts.length)
subPnts[pntCounter] = pnts[blockCounter * 3.0 + pntCounter];
else
{
var tmpPnt = document.documentElement.createSVGPoint();
tmpPnt.x = 0.0;
tmpPnt.y = 0.0;
subPnts[pntCounter] = tmpPnt;
}
}
var matrixPnt = (new matrixSVG).fromElements(subPnts[0].x, subPnts[1].x, subPnts[2].x, subPnts[0].y, subPnts[1].y, subPnts[2].y, 1, 1, 1);
var matrixTrans = matrixProjection.mult(matrixPnt);
for (var pntCounter = 0; pntCounter &lt; 3.0; pntCounter++)
{
if (blockCounter * 3.0 + pntCounter &lt; pnts.length)
{
if ((pntCounter == 0) &amp;&amp; !((matrixTrans.e11 &gt; 0.01) &amp;&amp; (matrixTrans.e11 &lt; 0.99) &amp;&amp; (matrixTrans.e21 &gt; 0.01) &amp;&amp; (matrixTrans.e21 &lt; 0.99)))
return false;
else if ((pntCounter == 1) &amp;&amp; !((matrixTrans.e12 &gt; 0.01) &amp;&amp; (matrixTrans.e12 &lt; 0.99) &amp;&amp; (matrixTrans.e22 &gt; 0.01) &amp;&amp; (matrixTrans.e22 &lt; 0.99)))
return false;
else if ((pntCounter == 2) &amp;&amp; !((matrixTrans.e13 &gt; 0.01) &amp;&amp; (matrixTrans.e13 &lt; 0.99) &amp;&amp; (matrixTrans.e23 &gt; 0.01) &amp;&amp; (matrixTrans.e23 &lt; 0.99)))
return false;
}
}
}
return true;
}
/** Event handler for mouse movements.
*
* @param e Event object.
*/
obj.mousemove = function (e)
{
obj.click = false;
if (!obj.dragging_active || obj.dragging_working)
return false;
obj.dragging_working = true;
var p = obj.getCoords(e);
if (slides[activeSlide].viewGroup.transform.baseVal.numberOfItems &lt; 1)
{
var matrix = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
}
else
{
var matrix = (new matrixSVG()).fromSVGMatrix(slides[activeSlide].viewGroup.transform.baseVal.consolidate().matrix);
}
matrix.e13 += p.x - obj.dragging_last.x;
matrix.e23 += p.y - obj.dragging_last.y;
slides[activeSlide][&quot;viewGroup&quot;].setAttribute(&quot;transform&quot;, matrix.toAttribute());
obj.dragging_last = p;
obj.dragging_working = false;
return false;
}
/** Event handler for mouse down.
*
* @param e Event object.
*/
obj.mousedown = function (e)
{
if (obj.dragging_active)
return false;
var value = 0;
if (e.button)
value = e.button;
else if (e.which)
value = e.which;
if (value == 1)
{
obj.dragging_last = obj.getCoords(e);
obj.dragging_active = true;
obj.click = true;
}
return false;
}
/** Event handler for mouse up.
*
* @param e Event object.
*/
obj.mouseup = function (e)
{
obj.dragging_active = false;
if (obj.click)
return obj.mouseclick(e);
else
return false;
}
/** Function to get the coordinates of a point corrected for the offset of the viewport.
*
* @param e Point.
* @returns Coordinates of the point corrected for the offset of the viewport.
*/
obj.getCoords = function (e)
{
var svgPoint = document.documentElement.createSVGPoint();
svgPoint.x = e.clientX + window.pageXOffset;
svgPoint.y = e.clientY + window.pageYOffset;
return svgPoint;
}
/** Event handler for scrolling.
*
* @param e Event object.
*/
obj.mousewheel = function(e)
{
var p = obj.projectCoords(obj.getCoords(e));
if (slides[activeSlide].viewGroup.transform.baseVal.numberOfItems &lt; 1)
{
var matrix = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
}
else
{
var matrix = (new matrixSVG()).fromSVGMatrix(slides[activeSlide].viewGroup.transform.baseVal.consolidate().matrix);
}
if (e.wheelDelta)
{ // IE Opera
delta = e.wheelDelta/120;
}
else if (e.detail)
{ // MOZ
delta = -e.detail/3;
}
var widthOld = p.x * matrix.e11 + p.y * matrix.e12;
var heightOld = p.x * matrix.e21 + p.y * matrix.e22;
matrix.e11 *= (1.0 - delta / 20.0);
matrix.e12 *= (1.0 - delta / 20.0);
matrix.e21 *= (1.0 - delta / 20.0);
matrix.e22 *= (1.0 - delta / 20.0);
var widthNew = p.x * matrix.e11 + p.y * matrix.e12;
var heightNew = p.x * matrix.e21 + p.y * matrix.e22;
matrix.e13 += (widthOld - widthNew);
matrix.e23 += (heightOld - heightNew);
slides[activeSlide][&quot;viewGroup&quot;].setAttribute(&quot;transform&quot;, matrix.toAttribute());
return false;
}
/** Function to project a point to screen coordinates.
*
* @param Point.
* @returns The point projected to screen coordinates.
*/
obj.projectCoords = function(pnt)
{
var matrix = slides[activeSlide][&quot;element&quot;].getScreenCTM();
if (slides[activeSlide][&quot;viewGroup&quot;])
matrix = slides[activeSlide][&quot;viewGroup&quot;].getScreenCTM();
pnt = pnt.matrixTransform(matrix.inverse());
return pnt;
}
/** Function to convert a rectangle into a point matrix.
*
* The function figures out a rectangle that encloses the rectangle given and has the same width/height ratio as the viewport of the presentation.
*
* @param rect Rectangle.
* @return The upper left, upper right and lower right corner of the rectangle in a point matrix.
*/
obj.rectToMatrix = function(rect)
{
rectWidth = rect.getBBox().width;
rectHeight = rect.getBBox().height;
rectX = rect.getBBox().x;
rectY = rect.getBBox().y;
rectXcorr = 0;
rectYcorr = 0;
scaleX = WIDTH / rectWidth;
scaleY = HEIGHT / rectHeight;
if (scaleX &gt; scaleY)
{
scaleX = scaleY;
rectXcorr -= (WIDTH / scaleX - rectWidth) / 2;
rectWidth = WIDTH / scaleX;
}
else
{
scaleY = scaleX;
rectYcorr -= (HEIGHT / scaleY - rectHeight) / 2;
rectHeight = HEIGHT / scaleY;
}
if (rect.transform.baseVal.numberOfItems &lt; 1)
{
mRectTrans = (new matrixSVG()).fromElements(1, 0, 0, 0, 1, 0, 0, 0, 1);
}
else
{
mRectTrans = (new matrixSVG()).fromSVGMatrix(rect.transform.baseVal.consolidate().matrix);
}
newBasePoints = (new matrixSVG()).fromElements(rectX, rectX, rectX, rectY, rectY, rectY, 1, 1, 1);
newVectors = (new matrixSVG()).fromElements(rectXcorr, rectXcorr + rectWidth, rectXcorr + rectWidth, rectYcorr, rectYcorr, rectYcorr + rectHeight, 0, 0, 0);
return mRectTrans.mult(newBasePoints.add(newVectors));
}
/** Function to return a transformation matrix from a point matrix.
*
* @param mPoints The point matrix.
* @returns The transformation matrix.
*/
obj.pointMatrixToTransformation = function(mPoints)
{
mPointsOld = (new matrixSVG()).fromElements(0, WIDTH, WIDTH, 0, 0, HEIGHT, 1, 1, 1);
return mPointsOld.mult(mPoints.inv());
}
}
</script>
</ns1:mousehandler>
</svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment