WPS 电子表格

This commit is contained in:
SheetJS 2022-10-20 20:10:10 -04:00
parent ce7a1f15ee
commit aa252651d5
17 changed files with 688 additions and 602 deletions

@ -100,7 +100,7 @@ importScripts("https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.mi
</code></pre>
## ECMAScript Module Imports in a SCRIPT TAG
## ECMAScript Module Imports
:::caution
@ -150,6 +150,7 @@ xport.addEventListener("click", async() => {
</script>`}
</code></pre>
Web Worker support is noted in [the demo](../../demos/worker#installation)
## Bower

@ -26,7 +26,7 @@ This was tested against `lume v1.12.0` on 2022 October 4.
1) Create a stock site:
```bash
mkdir sheetjs-lume
mkdir -p sheetjs-lume
cd sheetjs-lume
deno run -A https://deno.land/x/lume/init.ts
```
@ -41,7 +41,7 @@ The project will be configured and modules will be installed.
2) Download <https://sheetjs.com/pres.numbers> and place in a `_data` folder:
```bash
mkdir _data
mkdir -p _data
curl -LO https://sheetjs.com/pres.numbers
mv pres.numbers _data
```

@ -25,9 +25,48 @@ importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
For production use, it is highly encouraged to download and host the script.
<details><summary><b>ECMAScript Module Support</b> (click to show)</summary>
:::note Browser Compatibility
ESM is supported in Web Workers in the Chromium family of browsers (including
Chrome and Edge) as well as in Webkit-based browsers (including Safari).
For support in legacy browsers like Firefox, `importScripts` should be used.
:::
```js
import * as XLSX from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
```
When using modules, the script must be served with the correct MIME type and the
Worker constructor must set the `type` option:
```js
const worker_code = `\
/* load standalone script from CDN */
import * as XLSX from "https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs";
// ... do something with XLSX here ...
`;
const worker = new Worker(
URL.createObjectURL(
new Blob(
[ worker_code ],
// highlight-next-line
{ type: "text/javascript" } // second argument to the Blob constructor
)
),
// highlight-next-line
{type: "module"} // second argument to Worker constructor
);
```
</details>
## Downloading a Remote File
:::note
:::note fetch in Web Workers
`fetch` was enabled in Web Workers in Chrome 42 and Safari 10.3
@ -46,7 +85,7 @@ In the following example, the script:
```jsx live
function SheetJSFetchDLWorker() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
return ( <>
<button onClick={() => {
@ -70,7 +109,7 @@ self.addEventListener('message', async(e) => {
const html = XLSX.utils.sheet_to_html(ws);
/* Reply with result */
postMessage({html: html});
postMessage({ html });
} catch(e) {
/* Pass the error message back */
postMessage({html: String(e.message || e).bold() });
@ -82,14 +121,14 @@ self.addEventListener('message', async(e) => {
/* post a message to the worker */
worker.postMessage({});
}}><b>Click to Start</b></button>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</> );
}
```
## Creating a Local File
:::caution `XLSX.writeFile`
:::caution Writing files from Web Workers
`XLSX.writeFile` will not work in Web Workers! Raw file data can be passed from
the Web Worker to the main browser context for downloading.
@ -106,7 +145,7 @@ In the following example, the script:
```jsx live
function SheetJSWriteFileWorker() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
return ( <>
<button onClick={() => { setHTML("");
@ -154,23 +193,23 @@ SheetJS,in,Web,Workers
/* post a message to the worker */
worker.postMessage({});
}}><b>Click to Start</b></button>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</> );
}
```
## User-Submitted File
:::note
:::note FileReaderSync
Typically `FileReader` is used in the main browser context. In Web Workers, the
synchronous version `FileReaderSync` is more efficient.
:::
In the following example, the script:
In the following example, when a file is dropped over the DIV or when the INPUT
element is used to select a file, the script:
- waits for the user to drag-drop a file into a DIV
- sends the `File` object to the Web Worker
- loads the SheetJS library and parses the file in the Worker
- generates an HTML string of the first table in the Worker
@ -179,15 +218,12 @@ In the following example, the script:
```jsx live
function SheetJSDragDropWorker() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* suppress default behavior for drag and drop */
function suppress(e) { e.stopPropagation(); e.preventDefault(); }
return ( <>
<div onDragOver={suppress} onDragEnter={suppress} onDrop={(e) => {
suppress(e);
/* this mantra embeds the worker source in the function */
const worker = new Worker(URL.createObjectURL(new Blob([`\
/* this worker is shared between drag-drop and file input element */
const worker = new Worker(URL.createObjectURL(new Blob([`\
/* load standalone script from CDN */
importScripts("https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js");
@ -205,19 +241,27 @@ self.addEventListener('message', (e) => {
const html = XLSX.utils.sheet_to_html(ws);
/* Reply with result */
postMessage({html: html});
postMessage({ html });
} catch(e) {
/* Pass the error message back */
postMessage({html: String(e.message || e).bold() });
}
}, false);
`])));
/* when the worker sends back the HTML, add it to the DOM */
worker.onmessage = function(e) { setHTML(e.data.html); };
`])));
/* when the worker sends back the HTML, add it to the DOM */
worker.onmessage = function(e) { setHTML(e.data.html); };
return ( <>
<div onDragOver={suppress} onDragEnter={suppress} onDrop={(e) => {
suppress(e);
/* post a message with the first File to the worker */
worker.postMessage({ file: e.dataTransfer.files[0] });
}}>Drag a file to this DIV to process!</div>
<div dangerouslySetInnerHTML={{__html: html}}/>
}}>Drag a file to this DIV to process! (or use the file input)</div>
<input type="file" onChange={(e) => {
suppress(e);
/* post a message with the first File to the worker */
worker.postMessage({ file: e.target.files[0] });
}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</> );
}
```

@ -130,7 +130,7 @@ import { read, utils, writeFileXLSX } from 'xlsx';
export default function SheetJSReactHTML() {
/* the component state is an HTML string */
const [html, setHtml] = useState("");
const [__html, setHtml] = useState("");
/* the ref is used in export */
const tbl = useRef(null);
@ -157,7 +157,7 @@ export default function SheetJSReactHTML() {
return ( <>
<button onClick={exportFile}>Export XLSX</button>
// highlight-next-line
<div ref={tbl} dangerouslySetInnerHTML={{ __html: html }} />
<div ref={tbl} dangerouslySetInnerHTML={{ __html }} />
</>);
}
```

@ -782,7 +782,7 @@ With configuration, SystemJS supports both browser and NodeJS deployments.
:::caution
This demo was written against SystemJS 0.19, the most popular SystemJS version.
This demo was written against SystemJS 0.19, the most popular SystemJS version
used with Angular applications. In the years since the release, Angular and
other tools using SystemJS have switched to Webpack.

@ -119,7 +119,7 @@ exports.handler = function(event, context, callback) {
1) Create a new folder and download [`index.js`](pathname:///aws/index.js):
```bash
mkdir SheetJSLambda
mkdir -p SheetJSLambda
cd SheetJSLambda
curl -LO https://docs.sheetjs.com/aws/index.js
```
@ -127,7 +127,7 @@ curl -LO https://docs.sheetjs.com/aws/index.js
2) Install dependencies to the current directory;
```bash
mkdir node_modules
mkdir -p node_modules
npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz busboy
```

@ -107,7 +107,7 @@ and show the data in an HTML table.
```jsx live
function SheetJSXHRDL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* Fetch and update HTML */
React.useEffect(async() => {
@ -126,7 +126,7 @@ function SheetJSXHRDL() {
req.send();
}, []);
return (<div dangerouslySetInnerHTML={{__html: html}}/>);
return (<div dangerouslySetInnerHTML={{ __html }}/>);
}
```
@ -156,7 +156,7 @@ will parse the workbook and return an HTML table.
```jsx live
function SheetJSXHRUL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
const [sz, setSz] = React.useState(0);
const csv = "a,b,c\n1,2,3";
/* Fetch and update HTML */
@ -183,7 +183,7 @@ function SheetJSXHRUL() {
<div>{csv}</div>
{sz ? (<>
<b>Generated file size: {sz} bytes</b>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</>) : (<button onClick={xport}><b>Export and Upload!</b></button>)}
</pre>);
}
@ -217,7 +217,7 @@ the data in an HTML table.
```jsx live
function SheetJSFetchDL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* Fetch and update HTML */
React.useEffect(async() => {
@ -233,7 +233,7 @@ function SheetJSFetchDL() {
setHTML(XLSX.utils.sheet_to_html(ws));
}, []);
return (<div dangerouslySetInnerHTML={{__html: html}}/>);
return (<div dangerouslySetInnerHTML={{ __html }}/>);
}
```
@ -253,7 +253,7 @@ the workbook and return an HTML table.
```jsx live
function SheetJSFetchUL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
const [sz, setSz] = React.useState(0);
const csv = "a,b,c\n1,2,3";
/* Fetch and update HTML */
@ -280,7 +280,7 @@ function SheetJSFetchUL() {
<div>{csv}</div>
{sz ? (<>
<b>Generated file size: {sz} bytes</b>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</>) : (<button onClick={xport}><b>Export and Upload!</b></button>)}
</pre>);
}
@ -315,7 +315,7 @@ the data in an HTML table.
```jsx live
function SheetJSAxiosDL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* Fetch and update HTML */
React.useEffect(async() => {
@ -330,7 +330,7 @@ function SheetJSAxiosDL() {
setHTML(XLSX.utils.sheet_to_html(ws));
}, []);
return (<div dangerouslySetInnerHTML={{__html: html}}/>);
return (<div dangerouslySetInnerHTML={{ __html }}/>);
}
```
@ -349,7 +349,7 @@ the workbook and return an HTML table.
```jsx live
function SheetJSAxiosUL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
const [sz, setSz] = React.useState(0);
const csv = "a,b,c\n1,2,3";
/* Fetch and update HTML */
@ -376,7 +376,7 @@ function SheetJSAxiosUL() {
<div>{csv}</div>
{sz ? (<>
<b>Generated file size: {sz} bytes</b>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</>) : (<button onClick={xport}><b>Export and Upload!</b></button>)}
</pre>);
}
@ -406,7 +406,7 @@ show the data in an HTML table.
```jsx live
function SheetJSSuperAgentDL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* Fetch and update HTML */
React.useEffect(async() => {
@ -424,7 +424,7 @@ function SheetJSSuperAgentDL() {
});
}, []);
return (<div dangerouslySetInnerHTML={{__html: html}}/>);
return (<div dangerouslySetInnerHTML={{ __html }}/>);
}
```
@ -444,7 +444,7 @@ parse the workbook and return an HTML table.
```jsx live
function SheetJSSuperAgentUL() {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
const [sz, setSz] = React.useState(0);
const csv = "a,b,c\n1,2,3";
/* Fetch and update HTML */
@ -472,7 +472,7 @@ function SheetJSSuperAgentUL() {
<div>{csv}</div>
{sz ? (<>
<b>Generated file size: {sz} bytes</b>
<div dangerouslySetInnerHTML={{__html: html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</>) : (<button onClick={xport}><b>Export and Upload!</b></button>)}
</pre>);
}

@ -594,3 +594,12 @@ Z.TEST
```
</details>
## Caveats
In some cases, seemingly valid formulae may be rejected by spreadsheet software.
`EVALUATE` unprefixed function is supported in WPS Office formulae. It is not
valid in a cell formula in Excel. It can be used in an Excel defined name when
exporting to XLSM format but not XLSX. This is a limitation of Excel. Since WPS
Office accepts files with `EVALUATE`, the writer does not warn or throw errors.

@ -29,6 +29,7 @@ hide_table_of_contents: true
| UTF-16 Unicode Text (TXT) | ✔ | ✔ |
| **Other Workbook/Worksheet Formats** |:-----:|:-----:|
| Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) | ✔ | ✔ |
| WPS 电子表格 (ET) | ✔ | |
| OpenDocument Spreadsheet (ODS) | ✔ | ✔ |
| Flat XML ODF Spreadsheet (FODS) | ✔ | ✔ |
| Uniform Office Format Spreadsheet (标文通 UOS1/UOS2) | ✔ | |
@ -180,7 +181,7 @@ The parser focuses on extracting raw data from tables. Numbers technically
supports multiple tables in a logical worksheet, including custom titles. This
parser will generate one worksheet per Numbers table.
The writer currently exports a small range from the first worksheet.
The writer generates one table per sheet.
#### OpenDocument Spreadsheet (ODS/FODS)
@ -195,6 +196,11 @@ UOS is a very similar format, and it comes in 2 varieties corresponding to ODS
and FODS respectively. For the most part, the difference between the formats
is in the names of tags and attributes.
#### WPS Office Spreadsheet (ET)
ET is the native format for WPS Office Spreadsheet. It extends the BIFF8 XLS
format with proprietary extensions.
### Miscellaneous Worksheet Formats
Many older formats supported only one worksheet:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 352 KiB

@ -147,7 +147,7 @@ support for CSS styling and rich text.
```jsx live
/* The live editor requires this function wrapper */
function Numbers2HTML(props) {
const [html, setHTML] = React.useState("");
const [__html, setHTML] = React.useState("");
/* Fetch and update HTML */
React.useEffect(async() => {
@ -163,7 +163,7 @@ function Numbers2HTML(props) {
setHTML(XLSX.utils.sheet_to_html(ws));
}, []);
return (<div dangerouslySetInnerHTML={{__html: html}}/>);
return (<div dangerouslySetInnerHTML={{ __html }}/>);
}
```
@ -227,7 +227,7 @@ This,is,a,Test
}}><b>Export XLSX!</b></button>
{/* Show HTML preview */}
<div dangerouslySetInnerHTML={{__html}}/>
<div dangerouslySetInnerHTML={{ __html }}/>
</>);
}
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 31 KiB

@ -17,6 +17,7 @@ digraph G {
subgraph OLD {
node [style=filled,color=cyan];
nums [label="NUMBERS"];
et [label="ET"];
ods [label="ODS"];
fods [label="FODS"];
uos [label="UOS"];
@ -43,61 +44,62 @@ digraph G {
subgraph WORKBOOK {
edge [color=blue];
csf -> xlsx
csf -> xlsx
xlsx -> csf
csf -> xlsb
csf -> xlsb
xlsb -> csf
csf -> xlml
csf -> xlml
xlml -> csf
csf -> xls5
csf -> xls5
xls5 -> csf
csf -> xls8
csf -> xls8
xls8 -> csf
wq2 -> csf
ods -> csf
csf -> ods
wq2 -> csf
ods -> csf
csf -> ods
fods -> csf
csf -> fods
uos -> csf
wk3 -> csf
csf -> wk3
wk4 -> csf
123 -> csf
qpw -> csf
csf -> fods
uos -> csf
wk3 -> csf
csf -> wk3
wk4 -> csf
123 -> csf
qpw -> csf
nums -> csf
csf -> nums
csf -> nums
et -> csf
}
subgraph WORKSHEET {
edge [color=aquamarine4];
xls2 -> csf
csf -> xls2
csf -> xls2
xls3 -> csf
csf -> xls3
csf -> xls3
xls4 -> csf
csf -> xls4
csf -> slk
slk -> csf
csf -> dif
wk1 -> csf
csf -> wk1
xlr -> csf
wq1 -> csf
csf -> xls4
csf -> slk
slk -> csf
csf -> dif
wk1 -> csf
csf -> wk1
xlr -> csf
wq1 -> csf
wksl -> csf
wksm -> csf
dif -> csf
rtf -> csf
csf -> rtf
prn -> csf
csf -> prn
csv -> csf
csf -> csv
txt -> csf
csf -> txt
dbf -> csf
csf -> dbf
dif -> csf
rtf -> csf
csf -> rtf
prn -> csf
csf -> prn
csv -> csf
csf -> csv
txt -> csf
csf -> txt
dbf -> csf
csf -> dbf
html -> csf
csf -> html
csf -> eth
eth -> csf
csf -> html
csf -> eth
eth -> csf
}
}

@ -1,540 +1,552 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 3.0.0 (20220226.1711)
<!-- Generated by graphviz version 6.0.1 (20220911.1526)
-->
<!-- Title: G Pages: 1 -->
<svg width="1056pt" height="1033pt"
viewBox="0.00 0.00 1055.79 1032.90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1028.9)">
<svg width="1317pt" height="1269pt"
viewBox="0.00 0.00 1317.17 1269.35" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1265.35)">
<title>G</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1028.9 1051.79,-1028.9 1051.79,4 -4,4"/>
<polygon fill="white" stroke="none" points="-4,4 -4,-1265.35 1313.17,-1265.35 1313.17,4 -4,4"/>
<!-- csf -->
<g id="node1" class="node">
<title>csf</title>
<ellipse fill="none" stroke="black" cx="523.61" cy="-511.58" rx="94.52" ry="94.52"/>
<ellipse fill="none" stroke="black" cx="523.61" cy="-511.58" rx="98.51" ry="98.51"/>
<text text-anchor="middle" x="523.61" y="-541.98" font-family="Indie Flower" font-size="22.00">Common</text>
<text text-anchor="middle" x="523.61" y="-517.98" font-family="Indie Flower" font-size="22.00">Spreadsheet</text>
<text text-anchor="middle" x="523.61" y="-493.98" font-family="Indie Flower" font-size="22.00">Format</text>
<text text-anchor="middle" x="523.61" y="-469.98" font-family="Indie Flower" font-size="22.00">(JS Object)</text>
<ellipse fill="none" stroke="black" cx="652.98" cy="-627.81" rx="123.07" ry="123.07"/>
<ellipse fill="none" stroke="black" cx="652.98" cy="-627.81" rx="127.07" ry="127.07"/>
<text text-anchor="middle" x="652.98" y="-658.21" font-family="Indie Flower" font-size="22.00">Common</text>
<text text-anchor="middle" x="652.98" y="-634.21" font-family="Indie Flower" font-size="22.00">Spreadsheet</text>
<text text-anchor="middle" x="652.98" y="-610.21" font-family="Indie Flower" font-size="22.00">Format</text>
<text text-anchor="middle" x="652.98" y="-586.21" font-family="Indie Flower" font-size="22.00">(JS Object)</text>
</g>
<!-- xls2 -->
<g id="node2" class="node">
<title>xls2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="997.58" cy="-511.58" rx="50.41" ry="39.7"/>
<text text-anchor="middle" x="997.58" y="-517.98" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="997.58" y="-493.98" font-family="Indie Flower" font-size="22.00">BIFF2</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="1246.94" cy="-627.81" rx="62.45" ry="39.7"/>
<text text-anchor="middle" x="1246.94" y="-634.21" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="1246.94" y="-610.21" font-family="Indie Flower" font-size="22.00">BIFF2</text>
</g>
<!-- csf&#45;&gt;xls2 -->
<g id="edge25" class="edge">
<g id="edge26" class="edge">
<title>csf&#45;&gt;xls2</title>
<path fill="none" stroke="#458b74" d="M622.39,-517.19C717.42,-518.98 858.03,-518.67 937.37,-516.26"/>
<polygon fill="#458b74" stroke="#458b74" points="937.8,-519.75 947.68,-515.93 937.57,-512.76 937.8,-519.75"/>
<path fill="none" stroke="#458b74" d="M780.03,-633.46C900.33,-635.22 1076.7,-634.87 1174.63,-632.41"/>
<polygon fill="#458b74" stroke="#458b74" points="1174.83,-635.91 1184.73,-632.14 1174.64,-628.91 1174.83,-635.91"/>
</g>
<!-- xls3 -->
<g id="node3" class="node">
<title>xls3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="985.74" cy="-616.89" rx="48.58" ry="39.7"/>
<text text-anchor="middle" x="985.74" y="-623.29" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="985.74" y="-599.29" font-family="Indie Flower" font-size="22.00">BIFF3</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="1232.72" cy="-757.01" rx="60.62" ry="39.7"/>
<text text-anchor="middle" x="1232.72" y="-763.41" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="1232.72" y="-739.41" font-family="Indie Flower" font-size="22.00">BIFF3</text>
</g>
<!-- csf&#45;&gt;xls3 -->
<g id="edge27" class="edge">
<g id="edge28" class="edge">
<title>csf&#45;&gt;xls3</title>
<path fill="none" stroke="#458b74" d="M618.68,-539C711.44,-561.98 849.59,-593.14 927.26,-608.33"/>
<polygon fill="#458b74" stroke="#458b74" points="926.87,-611.81 937.35,-610.27 928.19,-604.94 926.87,-611.81"/>
<path fill="none" stroke="#458b74" d="M775.76,-660.96C893.76,-689.07 1067.85,-727.49 1163.49,-746.23"/>
<polygon fill="#458b74" stroke="#458b74" points="1162.86,-749.67 1173.35,-748.15 1164.2,-742.8 1162.86,-749.67"/>
</g>
<!-- xls4 -->
<g id="node4" class="node">
<title>xls4</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="951.7" cy="-715.02" rx="48.17" ry="39.7"/>
<text text-anchor="middle" x="951.7" y="-721.42" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="951.7" y="-697.42" font-family="Indie Flower" font-size="22.00">BIFF4</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="1191.34" cy="-878.73" rx="60.62" ry="39.7"/>
<text text-anchor="middle" x="1191.34" y="-885.13" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="1191.34" y="-861.13" font-family="Indie Flower" font-size="22.00">BIFF4</text>
</g>
<!-- csf&#45;&gt;xls4 -->
<g id="edge29" class="edge">
<g id="edge30" class="edge">
<title>csf&#45;&gt;xls4</title>
<path fill="none" stroke="#458b74" d="M610.42,-559.05C696.65,-602.03 826.1,-663.17 898.26,-694.7"/>
<polygon fill="#458b74" stroke="#458b74" points="897.06,-697.99 907.63,-698.76 899.85,-691.57 897.06,-697.99"/>
<path fill="none" stroke="#458b74" d="M765.75,-686.61C876.31,-740.12 1040.75,-816.32 1129.38,-854.76"/>
<polygon fill="#458b74" stroke="#458b74" points="1128.19,-858.06 1138.76,-858.81 1130.97,-851.63 1128.19,-858.06"/>
</g>
<!-- xls5 -->
<g id="node5" class="node">
<title>xls5</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="895.8" cy="-805.05" rx="50.82" ry="39.7"/>
<text text-anchor="middle" x="895.8" y="-811.45" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="895.8" y="-787.45" font-family="Indie Flower" font-size="22.00">BIFF5</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="1123" cy="-990.95" rx="63.78" ry="39.7"/>
<text text-anchor="middle" x="1123" y="-997.35" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="1123" y="-973.35" font-family="Indie Flower" font-size="22.00">BIFF5</text>
</g>
<!-- csf&#45;&gt;xls5 -->
<g id="edge7" class="edge">
<title>csf&#45;&gt;xls5</title>
<path fill="none" stroke="blue" d="M597.71,-577.15C672.23,-638.22 784.86,-726.59 848.21,-773.36"/>
<polygon fill="blue" stroke="blue" points="846.31,-776.31 856.44,-779.4 850.45,-770.66 846.31,-776.31"/>
<path fill="none" stroke="blue" d="M750.07,-709.96C847.44,-787.49 993.68,-899.91 1070.93,-956.2"/>
<polygon fill="blue" stroke="blue" points="1068.95,-959.08 1079.1,-962.12 1073.06,-953.42 1068.95,-959.08"/>
</g>
<!-- xls8 -->
<g id="node6" class="node">
<title>xls8</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="821.3" cy="-880.41" rx="48.17" ry="39.7"/>
<text text-anchor="middle" x="821.3" y="-886.81" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="821.3" y="-862.81" font-family="Indie Flower" font-size="22.00">BIFF8</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="1032.22" cy="-1084.94" rx="60.21" ry="39.7"/>
<text text-anchor="middle" x="1032.22" y="-1091.34" font-family="Indie Flower" font-size="22.00">XLS</text>
<text text-anchor="middle" x="1032.22" y="-1067.34" font-family="Indie Flower" font-size="22.00">BIFF8</text>
</g>
<!-- csf&#45;&gt;xls8 -->
<g id="edge9" class="edge">
<title>csf&#45;&gt;xls8</title>
<path fill="none" stroke="blue" d="M581.29,-591.97C641.33,-669.31 733.48,-782.86 784.4,-841.8"/>
<polygon fill="blue" stroke="blue" points="781.8,-844.14 791,-849.39 787.09,-839.55 781.8,-844.14"/>
<path fill="none" stroke="blue" d="M729.75,-729.21C809.3,-828 930.45,-973.25 992.55,-1043.68"/>
<polygon fill="blue" stroke="blue" points="990.21,-1046.32 999.46,-1051.48 995.45,-1041.68 990.21,-1046.32"/>
</g>
<!-- xlml -->
<g id="node7" class="node">
<title>xlml</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="721.05" cy="-942.48" rx="62.87" ry="39.7"/>
<text text-anchor="middle" x="721.05" y="-948.88" font-family="Indie Flower" font-size="22.00">SSML</text>
<text text-anchor="middle" x="721.05" y="-924.88" font-family="Indie Flower" font-size="22.00">(2003/4)</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="909.77" cy="-1163.4" rx="78.48" ry="39.7"/>
<text text-anchor="middle" x="909.77" y="-1169.8" font-family="Indie Flower" font-size="22.00">SSML</text>
<text text-anchor="middle" x="909.77" y="-1145.8" font-family="Indie Flower" font-size="22.00">(2003/4)</text>
</g>
<!-- csf&#45;&gt;xlml -->
<g id="edge5" class="edge">
<title>csf&#45;&gt;xlml</title>
<path fill="none" stroke="blue" d="M559.66,-603.72C598.81,-693.6 660.19,-826.63 694.96,-896.23"/>
<polygon fill="blue" stroke="blue" points="691.86,-897.85 699.48,-905.21 698.11,-894.7 691.86,-897.85"/>
<path fill="none" stroke="blue" d="M702.81,-744.82C756.58,-861.29 840.06,-1034.2 882.78,-1116.54"/>
<polygon fill="blue" stroke="blue" points="879.67,-1118.17 887.4,-1125.41 885.88,-1114.93 879.67,-1118.17"/>
</g>
<!-- xlsx -->
<g id="node8" class="node">
<title>xlsx</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="612.75" cy="-977.1" rx="43.68" ry="39.7"/>
<text text-anchor="middle" x="612.75" y="-983.5" font-family="Indie Flower" font-size="22.00">XLSX</text>
<text text-anchor="middle" x="612.75" y="-959.5" font-family="Indie Flower" font-size="22.00">XLSM</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="777.46" cy="-1208.58" rx="54.39" ry="39.7"/>
<text text-anchor="middle" x="777.46" y="-1214.98" font-family="Indie Flower" font-size="22.00">XLSX</text>
<text text-anchor="middle" x="777.46" y="-1190.98" font-family="Indie Flower" font-size="22.00">XLSM</text>
</g>
<!-- csf&#45;&gt;xlsx -->
<g id="edge1" class="edge">
<title>csf&#45;&gt;xlsx</title>
<path fill="none" stroke="blue" d="M536.68,-609.66C553.49,-707.36 581.86,-853.31 599,-928.49"/>
<polygon fill="blue" stroke="blue" points="595.68,-929.66 601.34,-938.61 602.5,-928.08 595.68,-929.66"/>
<path fill="none" stroke="blue" d="M674.08,-753.23C699.43,-880.52 740.85,-1071.11 762.95,-1159.86"/>
<polygon fill="blue" stroke="blue" points="759.58,-1160.82 765.41,-1169.66 766.37,-1159.11 759.58,-1160.82"/>
</g>
<!-- xlsb -->
<g id="node9" class="node">
<title>xlsb</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="507.8" cy="-985.3" rx="54.39" ry="39.7"/>
<text text-anchor="middle" x="507.8" y="-991.7" font-family="Indie Flower" font-size="22.00">XLSB</text>
<text text-anchor="middle" x="507.8" y="-967.7" font-family="Indie Flower" font-size="22.00">BIFF12</text>
<ellipse fill="#00ff00" stroke="#00ff00" cx="648.16" cy="-1221.76" rx="68.68" ry="39.7"/>
<text text-anchor="middle" x="648.16" y="-1228.16" font-family="Indie Flower" font-size="22.00">XLSB</text>
<text text-anchor="middle" x="648.16" y="-1204.16" font-family="Indie Flower" font-size="22.00">BIFF12</text>
</g>
<!-- csf&#45;&gt;xlsb -->
<g id="edge3" class="edge">
<title>csf&#45;&gt;xlsb</title>
<path fill="none" stroke="blue" d="M514.71,-610.13C509.53,-709.25 504.98,-858.13 505.12,-935.15"/>
<polygon fill="blue" stroke="blue" points="501.62,-935.54 505.17,-945.53 508.62,-935.51 501.62,-935.54"/>
<path fill="none" stroke="blue" d="M646.29,-754.82C643.33,-885.07 642.31,-1081.08 644.61,-1172.08"/>
<polygon fill="blue" stroke="blue" points="641.11,-1172.22 644.89,-1182.12 648.11,-1172.03 641.11,-1172.22"/>
</g>
<!-- nums -->
<g id="node10" class="node">
<title>nums</title>
<ellipse fill="cyan" stroke="cyan" cx="371.79" cy="-960.59" rx="77.15" ry="22.76"/>
<text text-anchor="middle" x="371.79" y="-954.99" font-family="Indie Flower" font-size="22.00">NUMBERS</text>
<ellipse fill="cyan" stroke="cyan" cx="476.1" cy="-1194.83" rx="98.99" ry="22.76"/>
<text text-anchor="middle" x="476.1" y="-1189.23" font-family="Indie Flower" font-size="22.00">NUMBERS</text>
</g>
<!-- csf&#45;&gt;nums -->
<g id="edge23" class="edge">
<title>csf&#45;&gt;nums</title>
<path fill="none" stroke="blue" d="M486.66,-603.37C450.44,-704.18 398.22,-860.67 378.95,-927.99"/>
<polygon fill="blue" stroke="blue" points="375.58,-927.06 376.25,-937.64 382.32,-928.95 375.58,-927.06"/>
<path fill="none" stroke="blue" d="M609.74,-747.42C566.53,-879.14 503.83,-1082.75 482.89,-1161.84"/>
<polygon fill="blue" stroke="blue" points="479.45,-1161.17 480.33,-1171.72 486.23,-1162.92 479.45,-1161.17"/>
</g>
<!-- ods -->
<g id="node11" class="node">
<g id="node12" class="node">
<title>ods</title>
<ellipse fill="cyan" stroke="cyan" cx="258.58" cy="-904.55" rx="42.35" ry="22.76"/>
<text text-anchor="middle" x="258.58" y="-898.95" font-family="Indie Flower" font-size="22.00">ODS</text>
<ellipse fill="cyan" stroke="cyan" cx="332.22" cy="-1127.72" rx="53.07" ry="22.76"/>
<text text-anchor="middle" x="332.22" y="-1122.12" font-family="Indie Flower" font-size="22.00">ODS</text>
</g>
<!-- csf&#45;&gt;ods -->
<g id="edge13" class="edge">
<title>csf&#45;&gt;ods</title>
<path fill="none" stroke="blue" d="M463.73,-590.35C402.62,-677.38 311.79,-813.17 274.9,-873.69"/>
<polygon fill="blue" stroke="blue" points="271.81,-872.02 269.65,-882.39 277.81,-875.63 271.81,-872.02"/>
<path fill="none" stroke="blue" d="M579.61,-731.7C503.59,-846.45 390.27,-1024.46 348.4,-1096.2"/>
<polygon fill="blue" stroke="blue" points="345.17,-1094.8 343.2,-1105.21 351.23,-1098.3 345.17,-1094.8"/>
</g>
<!-- fods -->
<g id="node12" class="node">
<g id="node13" class="node">
<title>fods</title>
<ellipse fill="cyan" stroke="cyan" cx="182.28" cy="-840.45" rx="50.41" ry="22.76"/>
<text text-anchor="middle" x="182.28" y="-834.85" font-family="Indie Flower" font-size="22.00">FODS</text>
<ellipse fill="cyan" stroke="cyan" cx="235.67" cy="-1050.48" rx="63.78" ry="22.76"/>
<text text-anchor="middle" x="235.67" y="-1044.88" font-family="Indie Flower" font-size="22.00">FODS</text>
</g>
<!-- csf&#45;&gt;fods -->
<g id="edge15" class="edge">
<title>csf&#45;&gt;fods</title>
<path fill="none" stroke="blue" d="M448.58,-576.09C371.6,-647.51 256.35,-759.37 206.55,-811.72"/>
<polygon fill="blue" stroke="blue" points="204,-809.32 199.69,-819 209.1,-814.12 204,-809.32"/>
<path fill="none" stroke="blue" d="M559.69,-714.25C462.76,-809.61 317.44,-957.8 260.11,-1020.7"/>
<polygon fill="blue" stroke="blue" points="257.35,-1018.53 253.24,-1028.29 262.55,-1023.22 257.35,-1018.53"/>
</g>
<!-- html -->
<g id="node14" class="node">
<g id="node15" class="node">
<title>html</title>
<ellipse fill="cyan" stroke="cyan" cx="118.85" cy="-758.21" rx="46.84" ry="39.7"/>
<text text-anchor="middle" x="118.85" y="-764.61" font-family="Indie Flower" font-size="22.00">HTML</text>
<text text-anchor="middle" x="118.85" y="-740.61" font-family="Indie Flower" font-size="22.00">Table</text>
<ellipse fill="cyan" stroke="cyan" cx="154.49" cy="-950.78" rx="57.97" ry="39.7"/>
<text text-anchor="middle" x="154.49" y="-957.18" font-family="Indie Flower" font-size="22.00">HTML</text>
<text text-anchor="middle" x="154.49" y="-933.18" font-family="Indie Flower" font-size="22.00">Table</text>
</g>
<!-- csf&#45;&gt;html -->
<g id="edge51" class="edge">
<g id="edge52" class="edge">
<title>csf&#45;&gt;html</title>
<path fill="none" stroke="#458b74" d="M436.33,-558.2C352,-607.43 227.75,-683.58 162.5,-726.37"/>
<polygon fill="#458b74" stroke="#458b74" points="160.5,-723.5 154.08,-731.93 164.35,-729.34 160.5,-723.5"/>
<path fill="none" stroke="#458b74" d="M543.27,-692.15C436.52,-759.13 279.4,-861.48 201.63,-915.19"/>
<polygon fill="#458b74" stroke="#458b74" points="199.23,-912.6 193,-921.17 203.22,-918.35 199.23,-912.6"/>
</g>
<!-- csv -->
<g id="node15" class="node">
<g id="node16" class="node">
<title>csv</title>
<ellipse fill="cyan" stroke="cyan" cx="79.84" cy="-678.11" rx="35.21" ry="22.76"/>
<text text-anchor="middle" x="79.84" y="-672.51" font-family="Indie Flower" font-size="22.00">CSV</text>
<ellipse fill="cyan" stroke="cyan" cx="103.65" cy="-853.72" rx="44.6" ry="22.76"/>
<text text-anchor="middle" x="103.65" y="-848.12" font-family="Indie Flower" font-size="22.00">CSV</text>
</g>
<!-- csf&#45;&gt;csv -->
<g id="edge45" class="edge">
<g id="edge46" class="edge">
<title>csf&#45;&gt;csv</title>
<path fill="none" stroke="#458b74" d="M429.15,-541.04C331.87,-575.47 185.16,-631.09 117.03,-659.87"/>
<polygon fill="#458b74" stroke="#458b74" points="115.39,-656.77 107.57,-663.91 118.14,-663.2 115.39,-656.77"/>
<path fill="none" stroke="#458b74" d="M533.32,-670.91C410.07,-719.5 224.93,-796.31 143.96,-833.04"/>
<polygon fill="#458b74" stroke="#458b74" points="142.25,-829.97 134.61,-837.31 145.16,-836.34 142.25,-829.97"/>
</g>
<!-- txt -->
<g id="node16" class="node">
<g id="node17" class="node">
<title>txt</title>
<ellipse fill="cyan" stroke="cyan" cx="55.15" cy="-583.75" rx="55.31" ry="39.7"/>
<text text-anchor="middle" x="55.15" y="-590.15" font-family="Indie Flower" font-size="22.00">TXT</text>
<text text-anchor="middle" x="55.15" y="-566.15" font-family="Indie Flower" font-size="22.00">UTF&#45;16</text>
<ellipse fill="cyan" stroke="cyan" cx="69.3" cy="-737.87" rx="69.09" ry="39.7"/>
<text text-anchor="middle" x="69.3" y="-744.27" font-family="Indie Flower" font-size="22.00">TXT</text>
<text text-anchor="middle" x="69.3" y="-720.27" font-family="Indie Flower" font-size="22.00">UTF&#45;16</text>
</g>
<!-- csf&#45;&gt;txt -->
<g id="edge47" class="edge">
<g id="edge48" class="edge">
<title>csf&#45;&gt;txt</title>
<path fill="none" stroke="#458b74" d="M425.12,-521.09C332.47,-533.58 196.55,-554.79 117.84,-569.24"/>
<polygon fill="#458b74" stroke="#458b74" points="116.78,-565.88 107.59,-571.15 118.06,-572.76 116.78,-565.88"/>
<path fill="none" stroke="#458b74" d="M527.07,-645.8C409.83,-666.14 239.07,-698.67 142.67,-719.27"/>
<polygon fill="#458b74" stroke="#458b74" points="141.76,-715.88 132.72,-721.41 143.24,-722.73 141.76,-715.88"/>
</g>
<!-- dbf -->
<g id="node17" class="node">
<g id="node18" class="node">
<title>dbf</title>
<ellipse fill="cyan" stroke="cyan" cx="50.78" cy="-478.57" rx="43.27" ry="22.76"/>
<text text-anchor="middle" x="50.78" y="-472.97" font-family="Indie Flower" font-size="22.00">DBF</text>
<ellipse fill="cyan" stroke="cyan" cx="59.31" cy="-608.98" rx="53.07" ry="22.76"/>
<text text-anchor="middle" x="59.31" y="-603.38" font-family="Indie Flower" font-size="22.00">DBF</text>
</g>
<!-- csf&#45;&gt;dbf -->
<g id="edge49" class="edge">
<g id="edge50" class="edge">
<title>csf&#45;&gt;dbf</title>
<path fill="none" stroke="#458b74" d="M425.45,-499.11C327.93,-490.46 182.02,-480.65 104.19,-477.83"/>
<polygon fill="#458b74" stroke="#458b74" points="104.24,-474.33 94.12,-477.5 104,-481.33 104.24,-474.33"/>
<path fill="none" stroke="#458b74" d="M526.16,-618.13C401.99,-612.38 217.94,-606.98 122.25,-606.62"/>
<polygon fill="#458b74" stroke="#458b74" points="122.15,-603.12 112.15,-606.61 122.14,-610.12 122.15,-603.12"/>
</g>
<!-- dif -->
<g id="node18" class="node">
<g id="node19" class="node">
<title>dif</title>
<ellipse fill="cyan" stroke="cyan" cx="64.07" cy="-395.46" rx="33.88" ry="22.76"/>
<text text-anchor="middle" x="64.07" y="-389.86" font-family="Indie Flower" font-size="22.00">DIF</text>
<ellipse fill="cyan" stroke="cyan" cx="71.25" cy="-507.86" rx="41.94" ry="22.76"/>
<text text-anchor="middle" x="71.25" y="-502.26" font-family="Indie Flower" font-size="22.00">DIF</text>
</g>
<!-- csf&#45;&gt;dif -->
<g id="edge32" class="edge">
<g id="edge33" class="edge">
<title>csf&#45;&gt;dif</title>
<path fill="none" stroke="#458b74" d="M429.2,-481.95C330.69,-455.07 180.59,-417.66 107.33,-402.16"/>
<polygon fill="#458b74" stroke="#458b74" points="108.02,-398.73 97.52,-400.12 106.6,-405.58 108.02,-398.73"/>
<path fill="none" stroke="#458b74" d="M529.68,-596.62C403.28,-568.62 212.8,-529.9 122.38,-514.31"/>
<polygon fill="#458b74" stroke="#458b74" points="122.83,-510.84 112.38,-512.61 121.65,-517.74 122.83,-510.84"/>
</g>
<!-- slk -->
<g id="node19" class="node">
<g id="node20" class="node">
<title>slk</title>
<ellipse fill="cyan" stroke="cyan" cx="90.7" cy="-318.6" rx="40.11" ry="22.76"/>
<text text-anchor="middle" x="90.7" y="-313" font-family="Indie Flower" font-size="22.00">SYLK</text>
<ellipse fill="cyan" stroke="cyan" cx="99.26" cy="-412.89" rx="50.41" ry="22.76"/>
<text text-anchor="middle" x="99.26" y="-407.29" font-family="Indie Flower" font-size="22.00">SYLK</text>
</g>
<!-- csf&#45;&gt;slk -->
<g id="edge30" class="edge">
<g id="edge31" class="edge">
<title>csf&#45;&gt;slk</title>
<path fill="none" stroke="#458b74" d="M435.66,-466.25C344.49,-423.52 205.65,-362.13 135.13,-333.78"/>
<polygon fill="#458b74" stroke="#458b74" points="136.23,-330.45 125.64,-330 133.64,-336.95 136.23,-330.45"/>
<path fill="none" stroke="#458b74" d="M536.57,-576.57C417.67,-528.41 238.49,-459.42 151,-428.59"/>
<polygon fill="#458b74" stroke="#458b74" points="152.15,-425.29 141.56,-425.29 149.84,-431.89 152.15,-425.29"/>
</g>
<!-- prn -->
<g id="node20" class="node">
<g id="node21" class="node">
<title>prn</title>
<ellipse fill="cyan" stroke="cyan" cx="133.25" cy="-242.74" rx="39.7" ry="22.76"/>
<text text-anchor="middle" x="133.25" y="-237.14" font-family="Indie Flower" font-size="22.00">PRN</text>
<ellipse fill="cyan" stroke="cyan" cx="147.05" cy="-316.64" rx="50.41" ry="22.76"/>
<text text-anchor="middle" x="147.05" y="-311.04" font-family="Indie Flower" font-size="22.00">PRN</text>
</g>
<!-- csf&#45;&gt;prn -->
<g id="edge43" class="edge">
<g id="edge44" class="edge">
<title>csf&#45;&gt;prn</title>
<path fill="none" stroke="#458b74" d="M445.43,-450.94C362.4,-391.42 234.63,-304.03 171.38,-264.02"/>
<polygon fill="#458b74" stroke="#458b74" points="172.86,-260.81 162.53,-258.47 169.14,-266.74 172.86,-260.81"/>
<path fill="none" stroke="#458b74" d="M547.71,-556.43C437.14,-486.18 268.64,-383.23 190.1,-338.55"/>
<polygon fill="#458b74" stroke="#458b74" points="191.41,-335.26 180.98,-333.39 187.97,-341.36 191.41,-335.26"/>
</g>
<!-- rtf -->
<g id="node21" class="node">
<g id="node22" class="node">
<title>rtf</title>
<ellipse fill="cyan" stroke="cyan" cx="186.96" cy="-177.94" rx="37.45" ry="22.76"/>
<text text-anchor="middle" x="186.96" y="-172.34" font-family="Indie Flower" font-size="22.00">RTF</text>
<ellipse fill="cyan" stroke="cyan" cx="209.04" cy="-233.21" rx="46.84" ry="22.76"/>
<text text-anchor="middle" x="209.04" y="-227.61" font-family="Indie Flower" font-size="22.00">RTF</text>
</g>
<!-- csf&#45;&gt;rtf -->
<g id="edge41" class="edge">
<g id="edge42" class="edge">
<title>csf&#45;&gt;rtf</title>
<path fill="none" stroke="#458b74" d="M457.39,-438.07C384.75,-363.31 271.41,-251.77 217.44,-202.62"/>
<polygon fill="#458b74" stroke="#458b74" points="219.68,-199.94 209.92,-195.84 214.99,-205.13 219.68,-199.94"/>
<path fill="none" stroke="#458b74" d="M561.77,-539.18C462.96,-448.73 310.47,-314.07 243.04,-258.5"/>
<polygon fill="#458b74" stroke="#458b74" points="245.21,-255.75 235.25,-252.13 240.77,-261.17 245.21,-255.75"/>
</g>
<!-- wk1 -->
<g id="node22" class="node">
<g id="node23" class="node">
<title>wk1</title>
<ellipse fill="cyan" stroke="cyan" cx="247.81" cy="-126.11" rx="35.21" ry="22.76"/>
<text text-anchor="middle" x="247.81" y="-120.51" font-family="Indie Flower" font-size="22.00">WK1</text>
<ellipse fill="cyan" stroke="cyan" cx="278.55" cy="-166.72" rx="42.35" ry="22.76"/>
<text text-anchor="middle" x="278.55" y="-161.12" font-family="Indie Flower" font-size="22.00">WK1</text>
</g>
<!-- csf&#45;&gt;wk1 -->
<g id="edge34" class="edge">
<g id="edge35" class="edge">
<title>csf&#45;&gt;wk1</title>
<path fill="none" stroke="#458b74" d="M470.68,-427.98C411.03,-341.2 316.74,-210.42 272.33,-153.8"/>
<polygon fill="#458b74" stroke="#458b74" points="274.86,-151.35 265.9,-145.69 269.37,-155.7 274.86,-151.35"/>
<path fill="none" stroke="#458b74" d="M577.27,-525.62C493.31,-419.08 362.35,-258.92 305.89,-194.74"/>
<polygon fill="#458b74" stroke="#458b74" points="308.31,-192.2 299.06,-187.04 303.08,-196.84 308.31,-192.2"/>
</g>
<!-- wk3 -->
<g id="node24" class="node">
<g id="node25" class="node">
<title>wk3</title>
<ellipse fill="cyan" stroke="cyan" cx="316.52" cy="-85.24" rx="37.45" ry="22.76"/>
<text text-anchor="middle" x="316.52" y="-79.64" font-family="Indie Flower" font-size="22.00">WK3</text>
<ellipse fill="cyan" stroke="cyan" cx="356.66" cy="-113.04" rx="45.01" ry="22.76"/>
<text text-anchor="middle" x="356.66" y="-107.44" font-family="Indie Flower" font-size="22.00">WK3</text>
</g>
<!-- csf&#45;&gt;wk3 -->
<g id="edge18" class="edge">
<title>csf&#45;&gt;wk3</title>
<path fill="none" stroke="blue" d="M485.49,-420.28C440.94,-324 369.25,-177.81 335.28,-115.28"/>
<polygon fill="blue" stroke="blue" points="338.25,-113.41 330.36,-106.34 332.11,-116.78 338.25,-113.41"/>
<path fill="none" stroke="blue" d="M594.49,-514.87C527.91,-395.2 422.72,-213.93 377.89,-142.98"/>
<polygon fill="blue" stroke="blue" points="380.81,-141.04 372.48,-134.49 374.9,-144.81 380.81,-141.04"/>
</g>
<!-- eth -->
<g id="node32" class="node">
<g id="node33" class="node">
<title>eth</title>
<ellipse fill="cyan" stroke="cyan" cx="392.47" cy="-56.11" rx="36.54" ry="22.76"/>
<text text-anchor="middle" x="392.47" y="-50.51" font-family="Indie Flower" font-size="22.00">ETH</text>
<ellipse fill="cyan" stroke="cyan" cx="445.63" cy="-71.21" rx="45.92" ry="22.76"/>
<text text-anchor="middle" x="445.63" y="-65.61" font-family="Indie Flower" font-size="22.00">ETH</text>
</g>
<!-- csf&#45;&gt;eth -->
<g id="edge52" class="edge">
<g id="edge53" class="edge">
<title>csf&#45;&gt;eth</title>
<path fill="none" stroke="#458b74" d="M501.66,-415.11C474.1,-312.13 428.15,-154.8 405.49,-87.94"/>
<polygon fill="#458b74" stroke="#458b74" points="408.76,-86.69 402.19,-78.38 402.14,-88.97 408.76,-86.69"/>
<path fill="none" stroke="#458b74" d="M613.92,-506.78C567.75,-377.1 493.39,-179.62 461.13,-103.07"/>
<polygon fill="#458b74" stroke="#458b74" points="464.19,-101.33 457.05,-93.51 457.75,-104.08 464.19,-101.33"/>
</g>
<!-- xls2&#45;&gt;csf -->
<g id="edge24" class="edge">
<g id="edge25" class="edge">
<title>xls2&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M947.31,-507.23C872.79,-504.62 731.21,-504.14 632.3,-505.8"/>
<polygon fill="#458b74" stroke="#458b74" points="632.21,-502.31 622.27,-505.98 632.33,-509.3 632.21,-502.31"/>
<path fill="none" stroke="#458b74" d="M1185.06,-623.49C1092.29,-620.86 914.8,-620.36 790.41,-622.01"/>
<polygon fill="#458b74" stroke="#458b74" points="790,-618.52 780.05,-622.16 790.1,-625.52 790,-618.52"/>
</g>
<!-- xls3&#45;&gt;csf -->
<g id="edge26" class="edge">
<g id="edge27" class="edge">
<title>xls3&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M940.26,-602.16C869.05,-583.17 729.27,-550.8 631.33,-530.2"/>
<polygon fill="#458b74" stroke="#458b74" points="631.89,-526.74 621.39,-528.12 630.46,-533.59 631.89,-526.74"/>
<path fill="none" stroke="#458b74" d="M1177.26,-740.34C1088.44,-717.74 911.75,-677.82 788.14,-652"/>
<polygon fill="#458b74" stroke="#458b74" points="788.72,-648.54 778.22,-649.93 787.29,-655.4 788.72,-648.54"/>
</g>
<!-- xls4&#45;&gt;csf -->
<g id="edge28" class="edge">
<g id="edge29" class="edge">
<title>xls4&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M912.45,-691.74C847.68,-657.9 716.49,-594.96 624.46,-553.11"/>
<polygon fill="#458b74" stroke="#458b74" points="625.68,-549.82 615.13,-548.88 622.79,-556.19 625.68,-549.82"/>
<path fill="none" stroke="#458b74" d="M1145.27,-852.8C1065.06,-812.24 897.14,-733.33 779.83,-680.54"/>
<polygon fill="#458b74" stroke="#458b74" points="780.97,-677.22 770.42,-676.31 778.1,-683.6 780.97,-677.22"/>
</g>
<!-- xls5&#45;&gt;csf -->
<g id="edge8" class="edge">
<title>xls5&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M863.35,-774.19C807.96,-726.96 693.45,-635.97 612.71,-574.48"/>
<polygon fill="blue" stroke="blue" points="614.59,-571.51 604.52,-568.25 610.36,-577.09 614.59,-571.51"/>
<path fill="none" stroke="blue" d="M1086.93,-958.13C1018.99,-901.87 869.63,-785.68 765.21,-707.2"/>
<polygon fill="blue" stroke="blue" points="767.24,-704.35 757.14,-701.14 763.04,-709.94 767.24,-704.35"/>
</g>
<!-- xls8&#45;&gt;csf -->
<g id="edge10" class="edge">
<title>xls8&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M798.28,-845.47C755.53,-787.92 662.57,-671.8 596.63,-592.85"/>
<polygon fill="blue" stroke="blue" points="599.04,-590.27 589.93,-584.85 593.67,-594.76 599.04,-590.27"/>
<path fill="none" stroke="blue" d="M1006.92,-1048.56C954.36,-980.32 831.39,-831.03 745.21,-729.91"/>
<polygon fill="blue" stroke="blue" points="747.71,-727.44 738.55,-722.11 742.38,-731.98 747.71,-727.44"/>
</g>
<!-- xlml&#45;&gt;csf -->
<g id="edge6" class="edge">
<title>xlml&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M707.67,-903.71C680.6,-837.59 618.76,-701.21 574.17,-608.06"/>
<polygon fill="blue" stroke="blue" points="577.26,-606.4 569.77,-598.9 570.95,-609.43 577.26,-606.4"/>
<path fill="none" stroke="blue" d="M895.02,-1124.15C861.21,-1046.24 777.16,-869.3 717.58,-749.15"/>
<polygon fill="blue" stroke="blue" points="720.56,-747.28 712.98,-739.88 714.29,-750.39 720.56,-747.28"/>
</g>
<!-- xlsx&#45;&gt;csf -->
<g id="edge2" class="edge">
<title>xlsx&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M609.18,-937.47C598.77,-867.34 571.02,-719.19 549.78,-617.52"/>
<polygon fill="blue" stroke="blue" points="553.16,-616.59 547.68,-607.52 546.31,-618.03 553.16,-616.59"/>
<path fill="none" stroke="blue" d="M772.62,-1168.82C758.23,-1086.14 717.45,-892.41 687.38,-760.68"/>
<polygon fill="blue" stroke="blue" points="690.79,-759.88 685.14,-750.91 683.96,-761.44 690.79,-759.88"/>
</g>
<!-- xlsb&#45;&gt;csf -->
<g id="edge4" class="edge">
<title>xlsb&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M513.06,-945.86C518.39,-875.15 524.03,-724.54 525.75,-620.69"/>
<polygon fill="blue" stroke="blue" points="529.26,-620.53 525.91,-610.47 522.26,-620.42 529.26,-620.53"/>
<path fill="none" stroke="blue" d="M652.08,-1181.89C656.02,-1098.06 658.36,-900.1 657.66,-764.98"/>
<polygon fill="blue" stroke="blue" points="661.16,-764.94 657.6,-754.96 654.16,-764.98 661.16,-764.94"/>
</g>
<!-- nums&#45;&gt;csf -->
<g id="edge22" class="edge">
<title>nums&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M382.8,-938.12C406.12,-880.29 460.03,-723.53 494.07,-617.04"/>
<polygon fill="blue" stroke="blue" points="497.49,-617.81 497.19,-607.22 490.82,-615.68 497.49,-617.81"/>
<path fill="none" stroke="blue" d="M486.25,-1172.05C511.48,-1104.06 576.52,-898.79 617.6,-760.69"/>
<polygon fill="blue" stroke="blue" points="621.02,-761.45 620.51,-750.87 614.31,-759.46 621.02,-761.45"/>
</g>
<!-- et -->
<g id="node11" class="node">
<title>et</title>
<ellipse fill="cyan" stroke="cyan" cx="530.57" cy="-46.6" rx="35.21" ry="22.76"/>
<text text-anchor="middle" x="530.57" y="-41" font-family="Indie Flower" font-size="22.00">ET</text>
</g>
<!-- et&#45;&gt;csf -->
<g id="edge24" class="edge">
<title>et&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M535.29,-69.02C549.82,-138.04 594.71,-351.14 624.65,-493.33"/>
<polygon fill="blue" stroke="blue" points="621.3,-494.38 626.78,-503.44 628.15,-492.94 621.3,-494.38"/>
</g>
<!-- ods&#45;&gt;csf -->
<g id="edge12" class="edge">
<title>ods&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M276.57,-883.88C315.28,-832.69 407.35,-697.62 467.54,-605.05"/>
<polygon fill="blue" stroke="blue" points="470.58,-606.81 473.09,-596.51 464.71,-603 470.58,-606.81"/>
<path fill="none" stroke="blue" d="M349.62,-1106.26C393.24,-1045.17 508.55,-867.15 583.81,-746.34"/>
<polygon fill="blue" stroke="blue" points="586.84,-748.08 589.15,-737.74 580.9,-744.39 586.84,-748.08"/>
</g>
<!-- fods&#45;&gt;csf -->
<g id="edge14" class="edge">
<title>fods&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M207.98,-820.71C258.64,-776.41 372.85,-667.38 449.09,-591.41"/>
<polygon fill="blue" stroke="blue" points="451.75,-593.71 456.35,-584.17 446.8,-588.76 451.75,-593.71"/>
<path fill="none" stroke="blue" d="M261.05,-1029.47C319.14,-975.63 463.88,-830.21 560.28,-729.95"/>
<polygon fill="blue" stroke="blue" points="563.03,-732.15 567.43,-722.51 557.98,-727.3 563.03,-732.15"/>
</g>
<!-- uos -->
<g id="node13" class="node">
<g id="node14" class="node">
<title>uos</title>
<ellipse fill="cyan" stroke="cyan" cx="474.39" cy="-40.17" rx="39.7" ry="22.76"/>
<text text-anchor="middle" x="474.39" y="-34.57" font-family="Indie Flower" font-size="22.00">UOS</text>
<ellipse fill="cyan" stroke="cyan" cx="621.75" cy="-34.67" rx="49.49" ry="22.76"/>
<text text-anchor="middle" x="621.75" y="-29.07" font-family="Indie Flower" font-size="22.00">UOS</text>
</g>
<!-- uos&#45;&gt;csf -->
<g id="edge16" class="edge">
<title>uos&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M476.76,-62.91C483.06,-123.25 500.52,-290.5 512.26,-402.87"/>
<polygon fill="blue" stroke="blue" points="508.78,-403.3 513.3,-412.89 515.74,-402.58 508.78,-403.3"/>
<path fill="none" stroke="blue" d="M622.95,-57.56C626.66,-127.99 638.11,-345.47 645.75,-490.57"/>
<polygon fill="blue" stroke="blue" points="642.27,-491.09 646.29,-500.89 649.26,-490.72 642.27,-491.09"/>
</g>
<!-- html&#45;&gt;csf -->
<g id="edge50" class="edge">
<g id="edge51" class="edge">
<title>html&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M159.46,-738.34C223.1,-702.82 347.81,-627.46 433.41,-573.32"/>
<polygon fill="#458b74" stroke="#458b74" points="435.51,-576.13 442.09,-567.82 431.77,-570.22 435.51,-576.13"/>
<path fill="none" stroke="#458b74" d="M200.04,-926.05C276.57,-879.92 433.04,-779.26 540.46,-707.62"/>
<polygon fill="#458b74" stroke="#458b74" points="542.7,-710.33 549.08,-701.87 538.82,-704.51 542.7,-710.33"/>
</g>
<!-- csv&#45;&gt;csf -->
<g id="edge44" class="edge">
<g id="edge45" class="edge">
<title>csv&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M112.7,-669.72C177.5,-648.8 324.08,-594.55 423.47,-555.34"/>
<polygon fill="#458b74" stroke="#458b74" points="424.92,-558.53 432.93,-551.6 422.35,-552.02 424.92,-558.53"/>
<path fill="none" stroke="#458b74" d="M141.91,-841.87C220.72,-812.99 404.09,-738.37 528.35,-685.32"/>
<polygon fill="#458b74" stroke="#458b74" points="529.75,-688.53 537.57,-681.38 527,-682.1 529.75,-688.53"/>
</g>
<!-- txt&#45;&gt;csf -->
<g id="edge46" class="edge">
<g id="edge47" class="edge">
<title>txt&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M110.5,-579.8C185.7,-570.71 321.69,-550.18 417.04,-533.85"/>
<polygon fill="#458b74" stroke="#458b74" points="417.75,-537.28 427.01,-532.13 416.56,-530.38 417.75,-537.28"/>
<path fill="none" stroke="#458b74" d="M137.37,-729.61C230.62,-714.55 400.06,-683.04 519.19,-658.93"/>
<polygon fill="#458b74" stroke="#458b74" points="520.01,-662.34 529.12,-656.92 518.62,-655.48 520.01,-662.34"/>
</g>
<!-- dbf&#45;&gt;csf -->
<g id="edge48" class="edge">
<g id="edge49" class="edge">
<title>dbf&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M92.04,-485.49C163.38,-493.37 311.94,-504.33 414.68,-509.78"/>
<polygon fill="#458b74" stroke="#458b74" points="414.62,-513.28 424.79,-510.3 414.98,-506.29 414.62,-513.28"/>
<path fill="none" stroke="#458b74" d="M110.83,-614.63C200.07,-620.36 386.23,-626.86 515.33,-629.25"/>
<polygon fill="#458b74" stroke="#458b74" points="515.63,-632.75 525.69,-629.43 515.75,-625.75 515.63,-632.75"/>
</g>
<!-- dif&#45;&gt;csf -->
<g id="edge39" class="edge">
<g id="edge40" class="edge">
<title>dif&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M93.7,-406.64C157.66,-426.19 311.34,-465.78 416.51,-490.49"/>
<polygon fill="#458b74" stroke="#458b74" points="416,-493.96 426.53,-492.83 417.59,-487.15 416,-493.96"/>
<path fill="none" stroke="#458b74" d="M107.81,-518.99C188.18,-538.96 383.67,-580.04 517.32,-605.75"/>
<polygon fill="#458b74" stroke="#458b74" points="516.76,-609.21 527.24,-607.66 518.08,-602.34 516.76,-609.21"/>
</g>
<!-- slk&#45;&gt;csf -->
<g id="edge31" class="edge">
<g id="edge32" class="edge">
<title>slk&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M118.64,-335.01C178.71,-365.35 322.62,-430.3 421.65,-472.47"/>
<polygon fill="#458b74" stroke="#458b74" points="420.52,-475.79 431.09,-476.48 423.26,-469.35 420.52,-475.79"/>
<path fill="none" stroke="#458b74" d="M133.05,-429.77C208.72,-462.72 395.14,-535.89 522.9,-583.54"/>
<polygon fill="#458b74" stroke="#458b74" points="521.79,-586.86 532.38,-587.07 524.23,-580.3 521.79,-586.86"/>
</g>
<!-- prn&#45;&gt;csf -->
<g id="edge42" class="edge">
<g id="edge43" class="edge">
<title>prn&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M154.84,-261.78C206.46,-301.46 339.28,-393.89 430.59,-454.55"/>
<polygon fill="#458b74" stroke="#458b74" points="428.75,-457.53 439.02,-460.13 432.62,-451.69 428.75,-457.53"/>
<path fill="none" stroke="#458b74" d="M172.54,-336.15C237.61,-380.33 413.03,-489.21 532.89,-560.76"/>
<polygon fill="#458b74" stroke="#458b74" points="531.4,-563.95 541.79,-566.06 534.99,-557.93 531.4,-563.95"/>
</g>
<!-- rtf&#45;&gt;csf -->
<g id="edge40" class="edge">
<g id="edge41" class="edge">
<title>rtf&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M202.98,-198.44C245.23,-245.28 361.45,-361.64 441.72,-438.59"/>
<polygon fill="#458b74" stroke="#458b74" points="439.73,-441.53 449.37,-445.91 444.57,-436.47 439.73,-441.53"/>
<path fill="none" stroke="#458b74" d="M227.81,-254.01C281.6,-306.77 438.93,-447.83 546.37,-540.81"/>
<polygon fill="#458b74" stroke="#458b74" points="544.16,-543.53 554.02,-547.42 548.74,-538.23 544.16,-543.53"/>
</g>
<!-- wk1&#45;&gt;csf -->
<g id="edge33" class="edge">
<g id="edge34" class="edge">
<title>wk1&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M259.28,-147.61C292.3,-199.97 388.7,-336.2 455.51,-426.34"/>
<polygon fill="#458b74" stroke="#458b74" points="452.7,-428.43 461.47,-434.37 458.32,-424.26 452.7,-428.43"/>
<path fill="none" stroke="#458b74" d="M292.35,-188.4C335.53,-247.61 470.02,-414.73 562.01,-524.97"/>
<polygon fill="#458b74" stroke="#458b74" points="559.46,-527.38 568.55,-532.81 564.83,-522.89 559.46,-527.38"/>
</g>
<!-- wksl -->
<g id="node23" class="node">
<g id="node24" class="node">
<title>wksl</title>
<ellipse fill="cyan" stroke="cyan" cx="567" cy="-39.6" rx="45.92" ry="39.7"/>
<text text-anchor="middle" x="567" y="-46" font-family="Indie Flower" font-size="22.00">WKS</text>
<text text-anchor="middle" x="567" y="-22" font-family="Indie Flower" font-size="22.00">Lotus</text>
<ellipse fill="cyan" stroke="cyan" cx="735.44" cy="-39.6" rx="57.05" ry="39.7"/>
<text text-anchor="middle" x="735.44" y="-46" font-family="Indie Flower" font-size="22.00">WKS</text>
<text text-anchor="middle" x="735.44" y="-22" font-family="Indie Flower" font-size="22.00">Lotus</text>
</g>
<!-- wksl&#45;&gt;csf -->
<g id="edge37" class="edge">
<g id="edge38" class="edge">
<title>wksl&#45;&gt;csf</title>
<path fill="none" stroke="#458b74" d="M563.34,-79.43C556.84,-150.09 543.09,-299.61 533.6,-402.83"/>
<polygon fill="#458b74" stroke="#458b74" points="530.1,-402.7 532.67,-412.98 537.07,-403.34 530.1,-402.7"/>
<path fill="none" stroke="#458b74" d="M729.9,-79.11C718.26,-162.16 690.77,-358.21 672.02,-492.01"/>
<polygon fill="#458b74" stroke="#458b74" points="668.55,-491.54 670.62,-501.93 675.48,-492.52 668.55,-491.54"/>
</g>
<!-- wk3&#45;&gt;csf -->
<g id="edge17" class="edge">
<title>wk3&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M323.83,-107.46C347.18,-163.91 419.76,-315.36 470.73,-415.98"/>
<polygon fill="blue" stroke="blue" points="467.64,-417.62 475.29,-424.95 473.88,-414.45 467.64,-417.62"/>
<path fill="none" stroke="blue" d="M366.15,-135.29C398.57,-199.35 505.69,-387.4 579.47,-511.73"/>
<polygon fill="blue" stroke="blue" points="576.6,-513.76 584.72,-520.56 582.62,-510.18 576.6,-513.76"/>
</g>
<!-- wk4 -->
<g id="node25" class="node">
<g id="node26" class="node">
<title>wk4</title>
<ellipse fill="cyan" stroke="cyan" cx="655.24" cy="-56.25" rx="36.54" ry="22.76"/>
<text text-anchor="middle" x="655.24" y="-50.65" font-family="Indie Flower" font-size="22.00">WK4</text>
<ellipse fill="cyan" stroke="cyan" cx="841.42" cy="-64.53" rx="44.6" ry="22.76"/>
<text text-anchor="middle" x="841.42" y="-58.93" font-family="Indie Flower" font-size="22.00">WK4</text>
</g>
<!-- wk4&#45;&gt;csf -->
<g id="edge19" class="edge">
<title>wk4&#45;&gt;csf</title>
<path fill="none" stroke="blue" d="M648.71,-78.83C631.69,-137.71 585.11,-298.83 553.84,-406.99"/>
<polygon fill="blue" stroke="blue" points="550.47,-406.05 551.06,-416.63 557.2,-408 550.47,-406.05"/>
<path fill="none" stroke="blue" d="M833.91,-86.96C811.3,-154.55 742.56,-360.05 696.61,-497.37"/>
<polygon fill="blue" stroke="blue" points="693.2,-496.55 693.35,-507.14 699.84,-498.77 693.2,-496.55"/>
</g>
<!-- 123 -->
<g id="node26" class="node">
<g id="node27" class="node">
<title>123</title>
<ellipse fill="cyan" stroke="cyan" cx="725.42" cy="-82.72" rx="31.23" ry="22.76"/>
<text text-anchor="middle" x="725.42" y="-77.12" font-family="Indie Flower" font-size="22.00">123</text>
<ellipse fill="cyan" stroke="cyan" cx="923.59" cy="-99.07" rx="37.45" ry="22.76"/>
<text text-anchor="middle" x="923.59" y="-93.47" font-family="Indie Flower" font-size="22.00">123</text>
</g>