我们现在需要将istar的数据源文件转换为对应的图形显示,生成对应的svg(scalable vector graphics)显示,这一步可以当然也直接交给javascript处理,也可以使用xml转换语言xsl来尝试一下:
xsl完整文件如下:
不注释了。。stomach began to hurt...
xsl完整文件如下:
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns="http://www.w3.org/2000/svg">
3
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
4
<xsl:template match="/">
5
<!--在打开svg的时候,自动创建link的显示-->
6
<svg onload="drawRelationships(evt)" width="100%" height="100%" version="1.1" id="istarSVG" preserveAspectRatio="xMidYMid meet" zoomAndPan="magnify">
7
<script language="JavaScript" xlink:href="./istar.js"/>
8
<!--指定javascript文件-->
9
<defs>
10
<!--自定义右键菜单-->
11
<menu id="NewMenu">
12
<header>XML to IStar Tool Menu</header>
13
<item enabled="no">XML to IStar Tool Menu</item>
14
<separator/>
15
<item action="ViewSource">View Source</item>
16
<item action="SaveSnapshotAs">Save Diagram As
</item>
17
<separator/>
18
<item action="About">About SVG Viewer</item>
19
</menu>
20
<!--定义滤镜效果-->
21
<filter id="DropShadowFilter" filterUnits="objectBoundingBox" x="-50%" y="-50%" width="200%" height="200%">
22
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="BlurAlpha"/>
23
<feOffset in="BlurAlpha" dx="4" dy="4" result="OffsetBlurAlpha"/>
24
<feMerge>
25
<feMergeNode in="OffsetBlurAlpha"/>
26
<feMergeNode in="SourceGraphic"/>
27
</feMerge>
28
</filter>
29
<!--定义istar需要的四种link的箭头-->
30
<g stroke="black" fill="none">
31
<!--箭头实在独立的viewbox中的,其坐标系即相对于线条方向而定-->
32
<marker id = "DependencyMarker" viewBox = "0 0 40 40" refX = "35" refY = "20" markerUnits = "strokeWidth" markerWidth = "30"
33
markerHeight ="10" stroke = "blue" stroke-width = "3" fill = "none"
34
orient = "auto" preserveAspectRatio="xMidYMid meet">
35
<path d="M0,40 l0,-40 c15,10 15,30 0,40"/>
36
</marker>
37
<marker id = "MeanMarker" viewBox = "0 0 60 40" refX = "35" refY = "20" markerUnits = "strokeWidth" markerWidth = "30"
38
markerHeight ="10" stroke = "blue" stroke-width = "3" fill = "none"
39
orient = "auto" preserveAspectRatio="xMidYMid meet">
40
<path d="M0,0 v40 l60,-20 l-60,-20"/>
41
</marker>
42
<marker id = "DecompositionMarker" viewBox = "0 0 40 40" refX = "35" refY = "20" markerUnits = "strokeWidth" markerWidth = "30"
43
markerHeight ="10" stroke = "blue" stroke-width = "3" fill = "none"
44
orient = "auto" preserveAspectRatio="xMidYMid meet">
45
<path d="M0,0 v40"/>
46
</marker>
47
<marker id = "ContributionMarker" viewBox = "0 0 40 40" refX = "35" refY = "20" markerUnits = "strokeWidth" markerWidth = "30"
48
markerHeight ="10" stroke = "blue" stroke-width = "3" fill = "none"
49
orient = "auto" preserveAspectRatio="xMidYMid meet">
50
<path d="M0,0 l40,20 l-40,20"/>
51
</marker>
52
</g>
53
</defs>
54
<!--定义背景框,主要是为了接收拖动时的处理函数-->
55
<g id="background" onmousemove="mouseMove()" onmouseup="mouseUp()" style="pointer-events: none;">
56
<rect id="border" x="0" y="0" width="100%" height="100%" style="fill: none; stroke-width: 1px; stroke: #000000; shape-rendering: optimizeSpeed;" transform="scale(1,1)"/>
57
</g>
58
<g fill="none" stroke="black" stroke-width="2">
59
<xsl:apply-templates select="*"/>
60
</g>
61
<g id="controls" transform="scale(1,1)translate(0,0)">
62
<rect x="260" y="10" rx="10" ry="10" width="100" height="100" style="fill:yellow;opacity:0.4;stroke:black;stroke-width:2;filter:url(#DropShadowFilter);"/>
63
<image id="panUp" x="280" y="36" onclick="pan(0,-1)" width="19" height="13" xlink:href="./images/up.gif"/>
64
<image id="panRight" x="300" y="50" onclick="pan(1,0)" width="13" height="19" xlink:href="./images/right.gif"/>
65
<image id="panDown" x="280" y="70" onclick="pan(0,1)" width="19" height="13" xlink:href="./images/down.gif"/>
66
<image id="panLeft" x="264" y="50" onclick="pan(-1,0)" width="13" height="19" xlink:href="./images/left.gif"/>
67
<image id="zoomIn" x="314" y="36" onclick="zoom(1.2)" width="19" height="19" xlink:href="./images/zoomIn.gif"/>
68
<image id="zoomOut" x="336" y="36" onclick="zoom(0.8)" width="19" height="19" xlink:href="./images/zoomOut.gif"/>
69
<image id="reset" x="323" y="62" onclick="reset()" width="21" height="21" xlink:href="./images/reset.gif"/>
70
</g>
71
</svg>
72
</xsl:template>
73
<xsl:template name="recursion">
74
<xsl:param name="actorindex"/>
75
<xsl:param name="Ypos1"/>
76
<xsl:choose>
77
<xsl:when test="$actorindex = 5">
78
<xsl:variable name="prenum" select="count(/istar/actor[1]/goal)
79
+ count(/istar/actor[1]/softgoal) + count(/istar/actor[1]/task)
80
+ count(/istar/actor[1]/resource) + count(/istar/actor[1]/belief)
81
+count(/istar/actor[2]/goal)
82
+ count(/istar/actor[2]/softgoal) + count(/istar/actor[2]/task)
83
+ count(/istar/actor[2]/resource) + count(/istar/actor[2]/belief)
84
+count(/istar/actor[3]/goal)
85
+ count(/istar/actor[3]/softgoal) + count(/istar/actor[3]/task)
86
+ count(/istar/actor[3]/resource) + count(/istar/actor[3]/belief)
87
+count(/istar/actor[4]/goal)
88
+ count(/istar/actor[4]/softgoal) + count(/istar/actor[4]/task)
89
+ count(/istar/actor[4]/resource) + count(/istar/actor[4]/belief)"/>
90
<xsl:variable name="Ypos2" select="$Ypos1 + format-number((($prenum) div 3), '#') * 150"/>
91
<xsl:value-of select="$Ypos2"/>
92
</xsl:when>
93
<xsl:when test="$actorindex = 4">
94
<xsl:variable name="prenum" select="count(/istar/actor[1]/goal)
95
+ count(/istar/actor[1]/softgoal) + count(/istar/actor[1]/task)
96
+ count(/istar/actor[1]/resource) + count(/istar/actor[1]/belief)
97
+count(/istar/actor[2]/goal)
98
+ count(/istar/actor[2]/softgoal) + count(/istar/actor[2]/task)
99
+ count(/istar/actor[2]/resource) + count(/istar/actor[2]/belief)
100
+count(/istar/actor[3]/goal)
101
+ count(/istar/actor[3]/softgoal) + count(/istar/actor[3]/task)
102
+ count(/istar/actor[3]/resource) + count(/istar/actor[3]/belief)"/>
103
<xsl:variable name="Ypos2" select="$Ypos1 + format-number((($prenum) div 3), '#') * 150"/>
104
<xsl:value-of select="$Ypos2"/>
105
</xsl:when>
106
<xsl:when test="$actorindex = 3">
107
<xsl:variable name="prenum" select="count(/istar/actor[1]/goal)
108
+ count(/istar/actor[1]/softgoal) + count(/istar/actor[1]/task)
109
+ count(/istar/actor[1]/resource) + count(/istar/actor[1]/belief)
110
+count(/istar/actor[2]/goal)
111
+ count(/istar/actor[2]/softgoal) + count(/istar/actor[2]/task)
112
+ count(/istar/actor[2]/resource) + count(/istar/actor[2]/belief)"/>
113
<xsl:variable name="Ypos2" select="$Ypos1 + format-number((($prenum) div 3), '#') * 150"/>
114
<xsl:value-of select="$Ypos2"/>
115
</xsl:when>
116
<xsl:when test="$actorindex = 2">
117
<xsl:variable name="prenum" select="count(/istar/actor[1]/goal)
118
+ count(/istar/actor[1]/softgoal) + count(/istar/actor[1]/task)
119
+ count(/istar/actor[1]/resource) + count(/istar/actor[1]/belief)"/>
120
<xsl:variable name="Ypos2" select="$Ypos1 + format-number((($prenum) div 3), '#') * 150"/>
121
<xsl:value-of select="$Ypos2"/>
122
</xsl:when>
123
<xsl:when test="$actorindex = 1">
124
<xsl:value-of select="$Ypos1"/>
125
</xsl:when>
126
</xsl:choose>
127
</xsl:template>
128
<xsl:template match="/istar/actor">
129
<xsl:param name="prenum" select="0"/>
130
<xsl:param name="actorindex" select="position()"/>
131
<xsl:param name="Ypos1" select="150 * position()"/>
132
<xsl:variable name="Ypos">
133
<xsl:call-template name="recursion">
134
<xsl:with-param name="Ypos1" select="150 * position()"/>
135
<xsl:with-param name="actorindex" select="position()"/>
136
</xsl:call-template>
137
</xsl:variable>
138
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="50" y="{$Ypos - 90}" height="100" width="100">
139
<circle r="50" cx="100" cy="{$Ypos - 90}"/>
140
<path d="M 10 {$Ypos - 90 } L 190 {$Ypos - 90 }" stroke="none">
141
<xsl:attribute name="id"><xsl:value-of select="concat('actor_', @ID)"/></xsl:attribute>
142
</path>
143
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
144
<textPath xlink:href="#{concat('actor_', @ID)}" startOffset="50%" dy="10">
145
<xsl:value-of select="name"/>
146
</textPath>
147
</text>
148
<xsl:for-each select="./*">
149
<xsl:apply-templates select=".">
150
<xsl:with-param name="xOffset" select="((position() - 2) mod 3) * 200 + 240"/>
151
<xsl:with-param name="yOffset" select="format-number(((position()) div 3), '#') * 150 + $Ypos - 150 "/>
152
</xsl:apply-templates>
153
</xsl:for-each>
154
</g>
155
</xsl:template>
156
<xsl:template match="/istar/actor/goal">
157
<xsl:param name="xOffset"/>
158
<xsl:param name="yOffset"/>
159
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
160
<rect x="{$xOffset}" y="{$yOffset}" rx="30" ry="50" width="120" height="80"/>
161
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
162
<xsl:attribute name="id"><xsl:value-of select="concat('innergoal_', @ID)"/></xsl:attribute>
163
</path>
164
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
165
<textPath xlink:href="#{concat('innergoal_', @ID)}" startOffset="50%" dy="10">
166
<xsl:value-of select="name"/>
167
</textPath>
168
</text>
169
</g>
170
</xsl:template>
171
<xsl:template match="istar/actor/softgoal">
172
<xsl:param name="xOffset"/>
173
<xsl:param name="yOffset"/>
174
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
175
<path d="M{$xOffset},{$yOffset+40} c0,-20 15,-40 30,-40 c15,10 45,10 60,0 c15,0 30,20 30,40
176
c0,20 -15,40 -30,40 c-15,-10 -45,-10 -60,0 c-15,0 -30,-20 -30,-40"/>
177
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
178
<xsl:attribute name="id"><xsl:value-of select="concat('innersoftgoal_', @ID)"/></xsl:attribute>
179
</path>
180
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
181
<textPath xlink:href="#{concat('innersoftgoal_', @ID)}" startOffset="50%" dy="10">
182
<xsl:value-of select="name"/>
183
</textPath>
184
</text>
185
</g>
186
</xsl:template>
187
<xsl:template match="istar/actor/task">
188
<xsl:param name="xOffset"/>
189
<xsl:param name="yOffset"/>
190
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
191
<path d="M{$xOffset},{$yOffset+40} l30,-40 h60 l30,40 l-30,40 h-60 l-30,-40"/>
192
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
193
<xsl:attribute name="id"><xsl:value-of select="concat('innertask_', @ID)"/></xsl:attribute>
194
</path>
195
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
196
<textPath xlink:href="#{concat('innertask_', @ID)}" startOffset="50%" dy="10">
197
<xsl:value-of select="name"/>
198
</textPath>
199
</text>
200
</g>
201
</xsl:template>
202
<xsl:template match="istar/actor/resource">
203
<xsl:param name="xOffset"/>
204
<xsl:param name="yOffset"/>
205
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
206
<rect x="{$xOffset}" y="{$yOffset}" width="120" height="80"/>
207
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
208
<xsl:attribute name="id"><xsl:value-of select="concat('innerresource_', @ID)"/></xsl:attribute>
209
</path>
210
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
211
<textPath xlink:href="#{concat('innerresource_', @ID)}" startOffset="50%" dy="10">
212
<xsl:value-of select="name"/>
213
</textPath>
214
</text>
215
</g>
216
</xsl:template>
217
<xsl:template match="istar/actor/belief">
218
<xsl:param name="xOffset"/>
219
<xsl:param name="yOffset"/>
220
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
221
<ellipse cx="{$xOffset+60}" cy="{$yOffset+40}" rx="60" ry="40"/>
222
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
223
<xsl:attribute name="id"><xsl:value-of select="concat('innergoal_', @ID)"/></xsl:attribute>
224
</path>
225
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
226
<textPath xlink:href="#{concat('innergoal_', @ID)}" startOffset="50%" dy="10">
227
<xsl:value-of select="name"/>
228
</textPath>
229
</text>
230
</g>
231
</xsl:template>
232
<xsl:template match="istar/actor/Mean-ends-link">
233
<g from="{from/@ID}" to="{to/@ID}">
234
<path marker-mid = "url(#MeanMarker)" d="M0,0 l80,75 l80,75"/>
235
</g>
236
</xsl:template>
237
<xsl:template match="istar/actor/Contribution-link">
238
<g from="{from/@ID}" to="{to/@ID}">
239
<path marker-end = "url(#ContributionMarker)" d="M0,0 l80,75 l80,75"/>
240
</g>
241
</xsl:template>
242
<xsl:template match="istar/actor/Decomposition-link">
243
<g from="{from/@ID}" to="{to/@ID}">
244
<path marker-mid = "url(#DecompositionMarker)" d="M0,0 l80,75 l80,75"/>
245
</g>
246
</xsl:template>
247
<xsl:template match="istar/goal">
248
<xsl:param name="precount" select="position() - count(/istar/actor)"/>
249
<xsl:param name="xOffset" select="(($precount + 1) mod 2) * 200 + 940"/>
250
<xsl:param name="yOffset" select="format-number(( ($precount + 1) div 2 ), '#') * 250 - 200"/>
251
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
252
<rect x="{$xOffset}" y="{$yOffset}" rx="30" ry="50" width="120" height="80"/>
253
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
254
<xsl:attribute name="id"><xsl:value-of select="concat('outgoal', @ID)"/></xsl:attribute>
255
</path>
256
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
257
<textPath xlink:href="#{concat('outgoal', @ID)}" startOffset="50%" dy="10">
258
<xsl:value-of select="name"/>
259
</textPath>
260
</text>
261
</g>
262
</xsl:template>
263
<xsl:template match="istar/softgoal">
264
<xsl:param name="precount" select="position() - count(/istar/actor)"/>
265
<xsl:param name="xOffset" select="(($precount + 1) mod 2) * 200 + 940"/>
266
<xsl:param name="yOffset" select="format-number(( ($precount + 1) div 2 ), '#') * 250 - 200"/>
267
268
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
269
<path d="M{$xOffset},{$yOffset+40} c0,-20 15,-40 30,-40 c15,10 45,10 60,0 c15,0 30,20 30,40
270
c0,20 -15,40 -30,40 c-15,-10 -45,-10 -60,0 c-15,0 -30,-20 -30,-40"/>
271
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
272
<xsl:attribute name="id"><xsl:value-of select="concat('outgoal', @ID)"/></xsl:attribute>
273
</path>
274
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
275
<textPath xlink:href="#{concat('outgoal', @ID)}" startOffset="50%" dy="10">
276
<xsl:value-of select="name"/>
277
</textPath>
278
</text>
279
</g>
280
</xsl:template>
281
<xsl:template match="istar/task">
282
<xsl:param name="precount" select="position() - count(/istar/actor)"/>
283
<xsl:param name="xOffset" select="(($precount + 1) mod 2) * 200 + 940"/>
284
<xsl:param name="yOffset" select="format-number(( ($precount + 1) div 2 ), '#') * 250 - 200"/>
285
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
286
<path d="M{$xOffset},{$yOffset+40} l30,-40 h60 l30,40 l-30,40 h-60 l-30,-40"/>
287
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
288
<xsl:attribute name="id"><xsl:value-of select="concat('outgoal', @ID)"/></xsl:attribute>
289
</path>
290
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
291
<textPath xlink:href="#{concat('outgoal', @ID)}" startOffset="50%" dy="10">
292
<xsl:value-of select="name"/>
293
</textPath>
294
</text>
295
</g>
296
</xsl:template>
297
<xsl:template match="istar/resource">
298
<xsl:param name="precount" select="position() - count(/istar/actor)"/>
299
<xsl:param name="xOffset" select="(($precount + 1) mod 2) * 200 + 940"/>
300
<xsl:param name="yOffset" select="format-number(( ($precount + 1) div 2 ), '#') * 250 - 200"/>
301
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
302
<rect x="{$xOffset}" y="{$yOffset}" width="120" height="80"/>
303
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
304
<xsl:attribute name="id"><xsl:value-of select="concat('outgoal', @ID)"/></xsl:attribute>
305
</path>
306
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
307
<textPath xlink:href="#{concat('outgoal', @ID)}" startOffset="50%" dy="10">
308
<xsl:value-of select="name"/>
309
</textPath>
310
</text>
311
</g>
312
</xsl:template>
313
<xsl:template match="istar/belief">
314
<xsl:param name="precount" select="position() - count(/istar/actor)"/>
315
<xsl:param name="xOffset" select="(($precount + 1) mod 2) * 200 + 940"/>
316
<xsl:param name="yOffset" select="format-number(( ($precount + 1) div 2 ), '#') * 250 - 200"/>
317
<g id="{@ID}" onmousedown="mouseDown()" style="pointer-events:all;opacity:1.0;z-index:1;" transform="translate(0,0)" x="{$xOffset}" y="{$yOffset+40}" height="80" width="120">
318
<ellipse cx="{$xOffset+60}" cy="{$yOffset+40}" rx="60" ry="40"/>
319
<path d="M {$xOffset + 10 - 40} {$yOffset+40} L {$xOffset + 190 -40 } {$yOffset+40}" stroke="none">
320
<xsl:attribute name="id"><xsl:value-of select="concat('outgoal', @ID)"/></xsl:attribute>
321
</path>
322
<text text-anchor="middle" font-family="Verdana" font-size="10" fill="blue" stroke-width="0" startOffset="0">
323
<textPath xlink:href="#{concat('outgoal', @ID)}" startOffset="50%" dy="10">
324
<xsl:value-of select="name"/>
325
</textPath>
326
</text>
327
</g>
328
</xsl:template>
329
<xsl:template match="istar/Dependency-link">
330
<g from="{depender/@ID}" to="{dependee/@ID}">
331
<path marker-mid = "url(#DependencyMarker)" d="M0,0 l80,75 l80,75"/>
332
</g>
333
</xsl:template>
334
<xsl:template match="//name">
335
</xsl:template>
336
</xsl:stylesheet>
337![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)
55
![](/Images/OutliningIndicators/None.gif)
56
![](/Images/OutliningIndicators/None.gif)
57
![](/Images/OutliningIndicators/None.gif)
58
![](/Images/OutliningIndicators/None.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/None.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/None.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
74
![](/Images/OutliningIndicators/None.gif)
75
![](/Images/OutliningIndicators/None.gif)
76
![](/Images/OutliningIndicators/None.gif)
77
![](/Images/OutliningIndicators/None.gif)
78
![](/Images/OutliningIndicators/None.gif)
79
![](/Images/OutliningIndicators/None.gif)
80
![](/Images/OutliningIndicators/None.gif)
81
![](/Images/OutliningIndicators/None.gif)
82
![](/Images/OutliningIndicators/None.gif)
83
![](/Images/OutliningIndicators/None.gif)
84
![](/Images/OutliningIndicators/None.gif)
85
![](/Images/OutliningIndicators/None.gif)
86
![](/Images/OutliningIndicators/None.gif)
87
![](/Images/OutliningIndicators/None.gif)
88
![](/Images/OutliningIndicators/None.gif)
89
![](/Images/OutliningIndicators/None.gif)
90
![](/Images/OutliningIndicators/None.gif)
91
![](/Images/OutliningIndicators/None.gif)
92
![](/Images/OutliningIndicators/None.gif)
93
![](/Images/OutliningIndicators/None.gif)
94
![](/Images/OutliningIndicators/None.gif)
95
![](/Images/OutliningIndicators/None.gif)
96
![](/Images/OutliningIndicators/None.gif)
97
![](/Images/OutliningIndicators/None.gif)
98
![](/Images/OutliningIndicators/None.gif)
99
![](/Images/OutliningIndicators/None.gif)
100
![](/Images/OutliningIndicators/None.gif)
101
![](/Images/OutliningIndicators/None.gif)
102
![](/Images/OutliningIndicators/None.gif)
103
![](/Images/OutliningIndicators/None.gif)
104
![](/Images/OutliningIndicators/None.gif)
105
![](/Images/OutliningIndicators/None.gif)
106
![](/Images/OutliningIndicators/None.gif)
107
![](/Images/OutliningIndicators/None.gif)
108
![](/Images/OutliningIndicators/None.gif)
109
![](/Images/OutliningIndicators/None.gif)
110
![](/Images/OutliningIndicators/None.gif)
111
![](/Images/OutliningIndicators/None.gif)
112
![](/Images/OutliningIndicators/None.gif)
113
![](/Images/OutliningIndicators/None.gif)
114
![](/Images/OutliningIndicators/None.gif)
115
![](/Images/OutliningIndicators/None.gif)
116
![](/Images/OutliningIndicators/None.gif)
117
![](/Images/OutliningIndicators/None.gif)
118
![](/Images/OutliningIndicators/None.gif)
119
![](/Images/OutliningIndicators/None.gif)
120
![](/Images/OutliningIndicators/None.gif)
121
![](/Images/OutliningIndicators/None.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
125
![](/Images/OutliningIndicators/None.gif)
126
![](/Images/OutliningIndicators/None.gif)
127
![](/Images/OutliningIndicators/None.gif)
128
![](/Images/OutliningIndicators/None.gif)
129
![](/Images/OutliningIndicators/None.gif)
130
![](/Images/OutliningIndicators/None.gif)
131
![](/Images/OutliningIndicators/None.gif)
132
![](/Images/OutliningIndicators/None.gif)
133
![](/Images/OutliningIndicators/None.gif)
134
![](/Images/OutliningIndicators/None.gif)
135
![](/Images/OutliningIndicators/None.gif)
136
![](/Images/OutliningIndicators/None.gif)
137
![](/Images/OutliningIndicators/None.gif)
138
![](/Images/OutliningIndicators/None.gif)
139
![](/Images/OutliningIndicators/None.gif)
140
![](/Images/OutliningIndicators/None.gif)
141
![](/Images/OutliningIndicators/None.gif)
142
![](/Images/OutliningIndicators/None.gif)
143
![](/Images/OutliningIndicators/None.gif)
144
![](/Images/OutliningIndicators/None.gif)
145
![](/Images/OutliningIndicators/None.gif)
146
![](/Images/OutliningIndicators/None.gif)
147
![](/Images/OutliningIndicators/None.gif)
148
![](/Images/OutliningIndicators/None.gif)
149
![](/Images/OutliningIndicators/None.gif)
150
![](/Images/OutliningIndicators/None.gif)
151
![](/Images/OutliningIndicators/None.gif)
152
![](/Images/OutliningIndicators/None.gif)
153
![](/Images/OutliningIndicators/None.gif)
154
![](/Images/OutliningIndicators/None.gif)
155
![](/Images/OutliningIndicators/None.gif)
156
![](/Images/OutliningIndicators/None.gif)
157
![](/Images/OutliningIndicators/None.gif)
158
![](/Images/OutliningIndicators/None.gif)
159
![](/Images/OutliningIndicators/None.gif)
160
![](/Images/OutliningIndicators/None.gif)
161
![](/Images/OutliningIndicators/None.gif)
162
![](/Images/OutliningIndicators/None.gif)
163
![](/Images/OutliningIndicators/None.gif)
164
![](/Images/OutliningIndicators/None.gif)
165
![](/Images/OutliningIndicators/None.gif)
166
![](/Images/OutliningIndicators/None.gif)
167
![](/Images/OutliningIndicators/None.gif)
168
![](/Images/OutliningIndicators/None.gif)
169
![](/Images/OutliningIndicators/None.gif)
170
![](/Images/OutliningIndicators/None.gif)
171
![](/Images/OutliningIndicators/None.gif)
172
![](/Images/OutliningIndicators/None.gif)
173
![](/Images/OutliningIndicators/None.gif)
174
![](/Images/OutliningIndicators/None.gif)
175
![](/Images/OutliningIndicators/None.gif)
176
![](/Images/OutliningIndicators/None.gif)
177
![](/Images/OutliningIndicators/None.gif)
178
![](/Images/OutliningIndicators/None.gif)
179
![](/Images/OutliningIndicators/None.gif)
180
![](/Images/OutliningIndicators/None.gif)
181
![](/Images/OutliningIndicators/None.gif)
182
![](/Images/OutliningIndicators/None.gif)
183
![](/Images/OutliningIndicators/None.gif)
184
![](/Images/OutliningIndicators/None.gif)
185
![](/Images/OutliningIndicators/None.gif)
186
![](/Images/OutliningIndicators/None.gif)
187
![](/Images/OutliningIndicators/None.gif)
188
![](/Images/OutliningIndicators/None.gif)
189
![](/Images/OutliningIndicators/None.gif)
190
![](/Images/OutliningIndicators/None.gif)
191
![](/Images/OutliningIndicators/None.gif)
192
![](/Images/OutliningIndicators/None.gif)
193
![](/Images/OutliningIndicators/None.gif)
194
![](/Images/OutliningIndicators/None.gif)
195
![](/Images/OutliningIndicators/None.gif)
196
![](/Images/OutliningIndicators/None.gif)
197
![](/Images/OutliningIndicators/None.gif)
198
![](/Images/OutliningIndicators/None.gif)
199
![](/Images/OutliningIndicators/None.gif)
200
![](/Images/OutliningIndicators/None.gif)
201
![](/Images/OutliningIndicators/None.gif)
202
![](/Images/OutliningIndicators/None.gif)
203
![](/Images/OutliningIndicators/None.gif)
204
![](/Images/OutliningIndicators/None.gif)
205
![](/Images/OutliningIndicators/None.gif)
206
![](/Images/OutliningIndicators/None.gif)
207
![](/Images/OutliningIndicators/None.gif)
208
![](/Images/OutliningIndicators/None.gif)
209
![](/Images/OutliningIndicators/None.gif)
210
![](/Images/OutliningIndicators/None.gif)
211
![](/Images/OutliningIndicators/None.gif)
212
![](/Images/OutliningIndicators/None.gif)
213
![](/Images/OutliningIndicators/None.gif)
214
![](/Images/OutliningIndicators/None.gif)
215
![](/Images/OutliningIndicators/None.gif)
216
![](/Images/OutliningIndicators/None.gif)
217
![](/Images/OutliningIndicators/None.gif)
218
![](/Images/OutliningIndicators/None.gif)
219
![](/Images/OutliningIndicators/None.gif)
220
![](/Images/OutliningIndicators/None.gif)
221
![](/Images/OutliningIndicators/None.gif)
222
![](/Images/OutliningIndicators/None.gif)
223
![](/Images/OutliningIndicators/None.gif)
224
![](/Images/OutliningIndicators/None.gif)
225
![](/Images/OutliningIndicators/None.gif)
226
![](/Images/OutliningIndicators/None.gif)
227
![](/Images/OutliningIndicators/None.gif)
228
![](/Images/OutliningIndicators/None.gif)
229
![](/Images/OutliningIndicators/None.gif)
230
![](/Images/OutliningIndicators/None.gif)
231
![](/Images/OutliningIndicators/None.gif)
232
![](/Images/OutliningIndicators/None.gif)
233
![](/Images/OutliningIndicators/None.gif)
234
![](/Images/OutliningIndicators/None.gif)
235
![](/Images/OutliningIndicators/None.gif)
236
![](/Images/OutliningIndicators/None.gif)
237
![](/Images/OutliningIndicators/None.gif)
238
![](/Images/OutliningIndicators/None.gif)
239
![](/Images/OutliningIndicators/None.gif)
240
![](/Images/OutliningIndicators/None.gif)
241
![](/Images/OutliningIndicators/None.gif)
242
![](/Images/OutliningIndicators/None.gif)
243
![](/Images/OutliningIndicators/None.gif)
244
![](/Images/OutliningIndicators/None.gif)
245
![](/Images/OutliningIndicators/None.gif)
246
![](/Images/OutliningIndicators/None.gif)
247
![](/Images/OutliningIndicators/None.gif)
248
![](/Images/OutliningIndicators/None.gif)
249
![](/Images/OutliningIndicators/None.gif)
250
![](/Images/OutliningIndicators/None.gif)
251
![](/Images/OutliningIndicators/None.gif)
252
![](/Images/OutliningIndicators/None.gif)
253
![](/Images/OutliningIndicators/None.gif)
254
![](/Images/OutliningIndicators/None.gif)
255
![](/Images/OutliningIndicators/None.gif)
256
![](/Images/OutliningIndicators/None.gif)
257
![](/Images/OutliningIndicators/None.gif)
258
![](/Images/OutliningIndicators/None.gif)
259
![](/Images/OutliningIndicators/None.gif)
260
![](/Images/OutliningIndicators/None.gif)
261
![](/Images/OutliningIndicators/None.gif)
262
![](/Images/OutliningIndicators/None.gif)
263
![](/Images/OutliningIndicators/None.gif)
264
![](/Images/OutliningIndicators/None.gif)
265
![](/Images/OutliningIndicators/None.gif)
266
![](/Images/OutliningIndicators/None.gif)
267
![](/Images/OutliningIndicators/None.gif)
268
![](/Images/OutliningIndicators/None.gif)
269
![](/Images/OutliningIndicators/None.gif)
270
![](/Images/OutliningIndicators/None.gif)
271
![](/Images/OutliningIndicators/None.gif)
272
![](/Images/OutliningIndicators/None.gif)
273
![](/Images/OutliningIndicators/None.gif)
274
![](/Images/OutliningIndicators/None.gif)
275
![](/Images/OutliningIndicators/None.gif)
276
![](/Images/OutliningIndicators/None.gif)
277
![](/Images/OutliningIndicators/None.gif)
278
![](/Images/OutliningIndicators/None.gif)
279
![](/Images/OutliningIndicators/None.gif)
280
![](/Images/OutliningIndicators/None.gif)
281
![](/Images/OutliningIndicators/None.gif)
282
![](/Images/OutliningIndicators/None.gif)
283
![](/Images/OutliningIndicators/None.gif)
284
![](/Images/OutliningIndicators/None.gif)
285
![](/Images/OutliningIndicators/None.gif)
286
![](/Images/OutliningIndicators/None.gif)
287
![](/Images/OutliningIndicators/None.gif)
288
![](/Images/OutliningIndicators/None.gif)
289
![](/Images/OutliningIndicators/None.gif)
290
![](/Images/OutliningIndicators/None.gif)
291
![](/Images/OutliningIndicators/None.gif)
292
![](/Images/OutliningIndicators/None.gif)
293
![](/Images/OutliningIndicators/None.gif)
294
![](/Images/OutliningIndicators/None.gif)
295
![](/Images/OutliningIndicators/None.gif)
296
![](/Images/OutliningIndicators/None.gif)
297
![](/Images/OutliningIndicators/None.gif)
298
![](/Images/OutliningIndicators/None.gif)
299
![](/Images/OutliningIndicators/None.gif)
300
![](/Images/OutliningIndicators/None.gif)
301
![](/Images/OutliningIndicators/None.gif)
302
![](/Images/OutliningIndicators/None.gif)
303
![](/Images/OutliningIndicators/None.gif)
304
![](/Images/OutliningIndicators/None.gif)
305
![](/Images/OutliningIndicators/None.gif)
306
![](/Images/OutliningIndicators/None.gif)
307
![](/Images/OutliningIndicators/None.gif)
308
![](/Images/OutliningIndicators/None.gif)
309
![](/Images/OutliningIndicators/None.gif)
310
![](/Images/OutliningIndicators/None.gif)
311
![](/Images/OutliningIndicators/None.gif)
312
![](/Images/OutliningIndicators/None.gif)
313
![](/Images/OutliningIndicators/None.gif)
314
![](/Images/OutliningIndicators/None.gif)
315
![](/Images/OutliningIndicators/None.gif)
316
![](/Images/OutliningIndicators/None.gif)
317
![](/Images/OutliningIndicators/None.gif)
318
![](/Images/OutliningIndicators/None.gif)
319
![](/Images/OutliningIndicators/None.gif)
320
![](/Images/OutliningIndicators/None.gif)
321
![](/Images/OutliningIndicators/None.gif)
322
![](/Images/OutliningIndicators/None.gif)
323
![](/Images/OutliningIndicators/None.gif)
324
![](/Images/OutliningIndicators/None.gif)
325
![](/Images/OutliningIndicators/None.gif)
326
![](/Images/OutliningIndicators/None.gif)
327
![](/Images/OutliningIndicators/None.gif)
328
![](/Images/OutliningIndicators/None.gif)
329
![](/Images/OutliningIndicators/None.gif)
330
![](/Images/OutliningIndicators/None.gif)
331
![](/Images/OutliningIndicators/None.gif)
332
![](/Images/OutliningIndicators/None.gif)
333
![](/Images/OutliningIndicators/None.gif)
334
![](/Images/OutliningIndicators/None.gif)
335
![](/Images/OutliningIndicators/None.gif)
336
![](/Images/OutliningIndicators/None.gif)
337
![](/Images/OutliningIndicators/None.gif)
不注释了。。stomach began to hurt...