File size: 51,507 Bytes
da43f5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
<?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 2.43.0 (0)
 -->
<!-- Title: %3 Pages: 1 -->
<svg width="2294pt" height="1216pt"
 viewBox="0.00 0.00 2293.50 1216.00" 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(36 1180)">
<title>%3</title>
<polygon fill="white" stroke="transparent" points="-36,36 -36,-1180 2257.5,-1180 2257.5,36 -36,36"/>
<!-- Reader -->
<g id="node1" class="node">
<title>Reader</title>
<path fill="#e8e8e8" stroke="transparent" d="M1157,-910C1157,-910 1392,-910 1392,-910 1398,-910 1404,-916 1404,-922 1404,-922 1404,-1128 1404,-1128 1404,-1134 1398,-1140 1392,-1140 1392,-1140 1157,-1140 1157,-1140 1151,-1140 1145,-1134 1145,-1128 1145,-1128 1145,-922 1145,-922 1145,-916 1151,-910 1157,-910"/>
<polygon fill="#bebebe" stroke="transparent" points="1146.5,-1117 1146.5,-1139 1403.5,-1139 1403.5,-1117 1146.5,-1117"/>
<text text-anchor="start" x="1256" y="-1126.2" font-family="Arial" font-weight="bold" font-size="11.00">Reader</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-1107 1146.5,-1117 1403.5,-1117 1403.5,-1107 1146.5,-1107"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-1085 1146.5,-1107 1403.5,-1107 1403.5,-1085 1146.5,-1085"/>
<text text-anchor="start" x="1151.5" y="-1093.2" font-family="Arial" font-size="11.00">&#45; readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-1063 1146.5,-1085 1403.5,-1085 1403.5,-1063 1146.5,-1063"/>
<text text-anchor="start" x="1151.5" y="-1071.2" font-family="Arial" font-size="11.00">+ username : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-1041 1146.5,-1063 1403.5,-1063 1403.5,-1041 1146.5,-1041"/>
<text text-anchor="start" x="1151.5" y="-1049.2" font-family="Arial" font-size="11.00">+ email : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-1019 1146.5,-1041 1403.5,-1041 1403.5,-1019 1146.5,-1019"/>
<text text-anchor="start" x="1151.5" y="-1027.2" font-family="Arial" font-size="11.00">+ membershipType : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-997 1146.5,-1019 1403.5,-1019 1403.5,-997 1146.5,-997"/>
<text text-anchor="start" x="1151.5" y="-1005.2" font-family="Arial" font-size="11.00">+ readingStreak : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-987 1146.5,-997 1403.5,-997 1403.5,-987 1146.5,-987"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-977 1146.5,-987 1403.5,-987 1403.5,-977 1146.5,-977"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-955 1146.5,-977 1403.5,-977 1403.5,-955 1146.5,-955"/>
<text text-anchor="start" x="1151.5" y="-963.2" font-family="Arial" font-size="11.00">+ Reader(username: String, email: String) : Reader</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-933 1146.5,-955 1403.5,-955 1403.5,-933 1146.5,-933"/>
<text text-anchor="start" x="1151.5" y="-941.2" font-family="Arial" font-size="11.00">+ borrowBook(bookId: String) : BorrowRecord</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1146.5,-911 1146.5,-933 1403.5,-933 1403.5,-911 1146.5,-911"/>
<text text-anchor="start" x="1151.5" y="-919.2" font-family="Arial" font-size="11.00">+ addToWishlist(bookId: String) : void</text>
<polygon fill="black" stroke="black" points="1145.5,-1117 1145.5,-1117 1404.5,-1117 1404.5,-1117 1145.5,-1117"/>
<polygon fill="black" stroke="black" points="1145.5,-987 1145.5,-987 1404.5,-987 1404.5,-987 1145.5,-987"/>
<path fill="none" stroke="black" d="M1157,-910C1157,-910 1392,-910 1392,-910 1398,-910 1404,-916 1404,-922 1404,-922 1404,-1128 1404,-1128 1404,-1134 1398,-1140 1392,-1140 1392,-1140 1157,-1140 1157,-1140 1151,-1140 1145,-1134 1145,-1128 1145,-1128 1145,-922 1145,-922 1145,-916 1151,-910 1157,-910"/>
</g>
<!-- BorrowRecord -->
<g id="node2" class="node">
<title>BorrowRecord</title>
<path fill="#e8e8e8" stroke="transparent" d="M291.5,-608C291.5,-608 595.5,-608 595.5,-608 601.5,-608 607.5,-614 607.5,-620 607.5,-620 607.5,-804 607.5,-804 607.5,-810 601.5,-816 595.5,-816 595.5,-816 291.5,-816 291.5,-816 285.5,-816 279.5,-810 279.5,-804 279.5,-804 279.5,-620 279.5,-620 279.5,-614 285.5,-608 291.5,-608"/>
<polygon fill="#bebebe" stroke="transparent" points="280.5,-793 280.5,-815 606.5,-815 606.5,-793 280.5,-793"/>
<text text-anchor="start" x="404.5" y="-802.2" font-family="Arial" font-weight="bold" font-size="11.00">BorrowRecord</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-783 280.5,-793 606.5,-793 606.5,-783 280.5,-783"/>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-761 280.5,-783 606.5,-783 606.5,-761 280.5,-761"/>
<text text-anchor="start" x="285.5" y="-769.2" font-family="Arial" font-size="11.00">&#45; borrowId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-739 280.5,-761 606.5,-761 606.5,-739 280.5,-739"/>
<text text-anchor="start" x="285.5" y="-747.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-717 280.5,-739 606.5,-739 606.5,-717 280.5,-717"/>
<text text-anchor="start" x="285.5" y="-725.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-695 280.5,-717 606.5,-717 606.5,-695 280.5,-695"/>
<text text-anchor="start" x="285.5" y="-703.2" font-family="Arial" font-size="11.00">+ borrowDate : Date</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-673 280.5,-695 606.5,-695 606.5,-673 280.5,-673"/>
<text text-anchor="start" x="285.5" y="-681.2" font-family="Arial" font-size="11.00">+ dueDate : Date</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-663 280.5,-673 606.5,-673 606.5,-663 280.5,-663"/>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-653 280.5,-663 606.5,-663 606.5,-653 280.5,-653"/>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-631 280.5,-653 606.5,-653 606.5,-631 280.5,-631"/>
<text text-anchor="start" x="285.5" y="-639.2" font-family="Arial" font-size="11.00">+ BorrowRecord(readerId: String, bookId: String) : BorrowRecord</text>
<polygon fill="#e8e8e8" stroke="transparent" points="280.5,-609 280.5,-631 606.5,-631 606.5,-609 280.5,-609"/>
<text text-anchor="start" x="285.5" y="-617.2" font-family="Arial" font-size="11.00">+ extendDueDate(days: int) : void</text>
<polygon fill="black" stroke="black" points="279.5,-793 279.5,-793 607.5,-793 607.5,-793 279.5,-793"/>
<polygon fill="black" stroke="black" points="279.5,-663 279.5,-663 607.5,-663 607.5,-663 279.5,-663"/>
<path fill="none" stroke="black" d="M291.5,-608C291.5,-608 595.5,-608 595.5,-608 601.5,-608 607.5,-614 607.5,-620 607.5,-620 607.5,-804 607.5,-804 607.5,-810 601.5,-816 595.5,-816 595.5,-816 291.5,-816 291.5,-816 285.5,-816 279.5,-810 279.5,-804 279.5,-804 279.5,-620 279.5,-620 279.5,-614 285.5,-608 291.5,-608"/>
</g>
<!-- Reader&#45;&gt;BorrowRecord -->
<g id="edge1" class="edge">
<title>Reader&#45;&gt;BorrowRecord</title>
<path fill="none" stroke="#4a4a4a" d="M1136.81,-1064C900.65,-1064 443.5,-1064 443.5,-1064 443.5,-1064 443.5,-830 443.5,-830"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="447,-830 443.5,-820 440,-830 447,-830"/>
<text text-anchor="middle" x="441.5" y="-822.8" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="1133.81" y="-1066.8" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Review -->
<g id="node9" class="node">
<title>Review</title>
<path fill="#e8e8e8" stroke="transparent" d="M1250,-4C1250,-4 1485,-4 1485,-4 1491,-4 1497,-10 1497,-16 1497,-16 1497,-200 1497,-200 1497,-206 1491,-212 1485,-212 1485,-212 1250,-212 1250,-212 1244,-212 1238,-206 1238,-200 1238,-200 1238,-16 1238,-16 1238,-10 1244,-4 1250,-4"/>
<polygon fill="#bebebe" stroke="transparent" points="1239.5,-189 1239.5,-211 1496.5,-211 1496.5,-189 1239.5,-189"/>
<text text-anchor="start" x="1349" y="-198.2" font-family="Arial" font-weight="bold" font-size="11.00">Review</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-179 1239.5,-189 1496.5,-189 1496.5,-179 1239.5,-179"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-157 1239.5,-179 1496.5,-179 1496.5,-157 1239.5,-157"/>
<text text-anchor="start" x="1244.5" y="-165.2" font-family="Arial" font-size="11.00">&#45; reviewId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-135 1239.5,-157 1496.5,-157 1496.5,-135 1239.5,-135"/>
<text text-anchor="start" x="1244.5" y="-143.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-113 1239.5,-135 1496.5,-135 1496.5,-113 1239.5,-113"/>
<text text-anchor="start" x="1244.5" y="-121.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-91 1239.5,-113 1496.5,-113 1496.5,-91 1239.5,-91"/>
<text text-anchor="start" x="1244.5" y="-99.2" font-family="Arial" font-size="11.00">+ rating : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-69 1239.5,-91 1496.5,-91 1496.5,-69 1239.5,-69"/>
<text text-anchor="start" x="1244.5" y="-77.2" font-family="Arial" font-size="11.00">+ comment : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-59 1239.5,-69 1496.5,-69 1496.5,-59 1239.5,-59"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-49 1239.5,-59 1496.5,-59 1496.5,-49 1239.5,-49"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-27 1239.5,-49 1496.5,-49 1496.5,-27 1239.5,-27"/>
<text text-anchor="start" x="1244.5" y="-35.2" font-family="Arial" font-size="11.00">+ Review(readerId: String, bookId: String) : Review</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1239.5,-5 1239.5,-27 1496.5,-27 1496.5,-5 1239.5,-5"/>
<text text-anchor="start" x="1244.5" y="-13.2" font-family="Arial" font-size="11.00">+ updateRating(newRating: int) : void</text>
<polygon fill="black" stroke="black" points="1238.5,-189 1238.5,-189 1497.5,-189 1497.5,-189 1238.5,-189"/>
<polygon fill="black" stroke="black" points="1238.5,-59 1238.5,-59 1497.5,-59 1497.5,-59 1238.5,-59"/>
<path fill="none" stroke="black" d="M1250,-4C1250,-4 1485,-4 1485,-4 1491,-4 1497,-10 1497,-16 1497,-16 1497,-200 1497,-200 1497,-206 1491,-212 1485,-212 1485,-212 1250,-212 1250,-212 1244,-212 1238,-206 1238,-200 1238,-200 1238,-16 1238,-16 1238,-10 1244,-4 1250,-4"/>
</g>
<!-- Reader&#45;&gt;Review -->
<g id="edge8" class="edge">
<title>Reader&#45;&gt;Review</title>
<path fill="none" stroke="#4a4a4a" d="M1326.33,-905.59C1326.33,-905.59 1326.33,-226.26 1326.33,-226.26"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="1329.83,-226.26 1326.33,-216.26 1322.83,-226.26 1329.83,-226.26"/>
<text text-anchor="middle" x="1324.33" y="-219.06" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="1323.33" y="-898.39" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Recommendation -->
<g id="node10" class="node">
<title>Recommendation</title>
<path fill="#e8e8e8" stroke="transparent" d="M1869.5,-608C1869.5,-608 2201.5,-608 2201.5,-608 2207.5,-608 2213.5,-614 2213.5,-620 2213.5,-620 2213.5,-804 2213.5,-804 2213.5,-810 2207.5,-816 2201.5,-816 2201.5,-816 1869.5,-816 1869.5,-816 1863.5,-816 1857.5,-810 1857.5,-804 1857.5,-804 1857.5,-620 1857.5,-620 1857.5,-614 1863.5,-608 1869.5,-608"/>
<polygon fill="#bebebe" stroke="transparent" points="1858.5,-793 1858.5,-815 2212.5,-815 2212.5,-793 1858.5,-793"/>
<text text-anchor="start" x="1989" y="-802.2" font-family="Arial" font-weight="bold" font-size="11.00">Recommendation</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-783 1858.5,-793 2212.5,-793 2212.5,-783 1858.5,-783"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-761 1858.5,-783 2212.5,-783 2212.5,-761 1858.5,-761"/>
<text text-anchor="start" x="1863.5" y="-769.2" font-family="Arial" font-size="11.00">&#45; recommendationId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-739 1858.5,-761 2212.5,-761 2212.5,-739 1858.5,-739"/>
<text text-anchor="start" x="1863.5" y="-747.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-717 1858.5,-739 2212.5,-739 2212.5,-717 1858.5,-717"/>
<text text-anchor="start" x="1863.5" y="-725.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-695 1858.5,-717 2212.5,-717 2212.5,-695 1858.5,-695"/>
<text text-anchor="start" x="1863.5" y="-703.2" font-family="Arial" font-size="11.00">+ confidence : double</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-673 1858.5,-695 2212.5,-695 2212.5,-673 1858.5,-673"/>
<text text-anchor="start" x="1863.5" y="-681.2" font-family="Arial" font-size="11.00">+ reason : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-663 1858.5,-673 2212.5,-673 2212.5,-663 1858.5,-663"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-653 1858.5,-663 2212.5,-663 2212.5,-653 1858.5,-653"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-631 1858.5,-653 2212.5,-653 2212.5,-631 1858.5,-631"/>
<text text-anchor="start" x="1863.5" y="-639.2" font-family="Arial" font-size="11.00">+ Recommendation(readerId: String, bookId: String) : Recommendation</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1858.5,-609 1858.5,-631 2212.5,-631 2212.5,-609 1858.5,-609"/>
<text text-anchor="start" x="1863.5" y="-617.2" font-family="Arial" font-size="11.00">+ calculateConfidence() : double</text>
<polygon fill="black" stroke="black" points="1857.5,-793 1857.5,-793 2213.5,-793 2213.5,-793 1857.5,-793"/>
<polygon fill="black" stroke="black" points="1857.5,-663 1857.5,-663 2213.5,-663 2213.5,-663 1857.5,-663"/>
<path fill="none" stroke="black" d="M1869.5,-608C1869.5,-608 2201.5,-608 2201.5,-608 2207.5,-608 2213.5,-614 2213.5,-620 2213.5,-620 2213.5,-804 2213.5,-804 2213.5,-810 2207.5,-816 2201.5,-816 2201.5,-816 1869.5,-816 1869.5,-816 1863.5,-816 1857.5,-810 1857.5,-804 1857.5,-804 1857.5,-620 1857.5,-620 1857.5,-614 1863.5,-608 1869.5,-608"/>
</g>
<!-- Reader&#45;&gt;Recommendation -->
<g id="edge11" class="edge">
<title>Reader&#45;&gt;Recommendation</title>
<path fill="none" stroke="#4a4a4a" d="M1412.22,-917C1615.9,-917 1973.67,-917 1973.67,-917 1973.67,-917 1973.67,-830.2 1973.67,-830.2"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="1977.17,-830.2 1973.67,-820.2 1970.17,-830.2 1977.17,-830.2"/>
<text text-anchor="middle" x="1971.67" y="-823" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="1415.22" y="-919.8" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- ReadingProgress -->
<g id="node12" class="node">
<title>ReadingProgress</title>
<path fill="#e8e8e8" stroke="transparent" d="M816,-4C816,-4 1147,-4 1147,-4 1153,-4 1159,-10 1159,-16 1159,-16 1159,-200 1159,-200 1159,-206 1153,-212 1147,-212 1147,-212 816,-212 816,-212 810,-212 804,-206 804,-200 804,-200 804,-16 804,-16 804,-10 810,-4 816,-4"/>
<polygon fill="#bebebe" stroke="transparent" points="805.5,-189 805.5,-211 1158.5,-211 1158.5,-189 805.5,-189"/>
<text text-anchor="start" x="936" y="-198.2" font-family="Arial" font-weight="bold" font-size="11.00">ReadingProgress</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-179 805.5,-189 1158.5,-189 1158.5,-179 805.5,-179"/>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-157 805.5,-179 1158.5,-179 1158.5,-157 805.5,-157"/>
<text text-anchor="start" x="810.5" y="-165.2" font-family="Arial" font-size="11.00">&#45; progressId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-135 805.5,-157 1158.5,-157 1158.5,-135 805.5,-135"/>
<text text-anchor="start" x="810.5" y="-143.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-113 805.5,-135 1158.5,-135 1158.5,-113 805.5,-113"/>
<text text-anchor="start" x="810.5" y="-121.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-91 805.5,-113 1158.5,-113 1158.5,-91 805.5,-91"/>
<text text-anchor="start" x="810.5" y="-99.2" font-family="Arial" font-size="11.00">+ currentPage : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-69 805.5,-91 1158.5,-91 1158.5,-69 805.5,-69"/>
<text text-anchor="start" x="810.5" y="-77.2" font-family="Arial" font-size="11.00">+ totalPages : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-59 805.5,-69 1158.5,-69 1158.5,-59 805.5,-59"/>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-49 805.5,-59 1158.5,-59 1158.5,-49 805.5,-49"/>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-27 805.5,-49 1158.5,-49 1158.5,-27 805.5,-27"/>
<text text-anchor="start" x="810.5" y="-35.2" font-family="Arial" font-size="11.00">+ ReadingProgress(readerId: String, bookId: String) : ReadingProgress</text>
<polygon fill="#e8e8e8" stroke="transparent" points="805.5,-5 805.5,-27 1158.5,-27 1158.5,-5 805.5,-5"/>
<text text-anchor="start" x="810.5" y="-13.2" font-family="Arial" font-size="11.00">+ updateProgress(page: int) : void</text>
<polygon fill="black" stroke="black" points="804.5,-189 804.5,-189 1159.5,-189 1159.5,-189 804.5,-189"/>
<polygon fill="black" stroke="black" points="804.5,-59 804.5,-59 1159.5,-59 1159.5,-59 804.5,-59"/>
<path fill="none" stroke="black" d="M816,-4C816,-4 1147,-4 1147,-4 1153,-4 1159,-10 1159,-16 1159,-16 1159,-200 1159,-200 1159,-206 1153,-212 1147,-212 1147,-212 816,-212 816,-212 810,-212 804,-206 804,-200 804,-200 804,-16 804,-16 804,-10 810,-4 816,-4"/>
</g>
<!-- Reader&#45;&gt;ReadingProgress -->
<g id="edge12" class="edge">
<title>Reader&#45;&gt;ReadingProgress</title>
<path fill="none" stroke="#4a4a4a" d="M1136.89,-985C1060.7,-985 981.25,-985 981.25,-985 981.25,-985 981.25,-226.42 981.25,-226.42"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="984.75,-226.42 981.25,-216.42 977.75,-226.42 984.75,-226.42"/>
<text text-anchor="middle" x="979.25" y="-219.22" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="1133.89" y="-987.8" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Analytics -->
<g id="node13" class="node">
<title>Analytics</title>
<path fill="#e8e8e8" stroke="transparent" d="M1089.5,-608C1089.5,-608 1263.5,-608 1263.5,-608 1269.5,-608 1275.5,-614 1275.5,-620 1275.5,-620 1275.5,-804 1275.5,-804 1275.5,-810 1269.5,-816 1263.5,-816 1263.5,-816 1089.5,-816 1089.5,-816 1083.5,-816 1077.5,-810 1077.5,-804 1077.5,-804 1077.5,-620 1077.5,-620 1077.5,-614 1083.5,-608 1089.5,-608"/>
<polygon fill="#bebebe" stroke="transparent" points="1078.5,-793 1078.5,-815 1274.5,-815 1274.5,-793 1078.5,-793"/>
<text text-anchor="start" x="1152" y="-802.2" font-family="Arial" font-weight="bold" font-size="11.00">Analytics</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-783 1078.5,-793 1274.5,-793 1274.5,-783 1078.5,-783"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-761 1078.5,-783 1274.5,-783 1274.5,-761 1078.5,-761"/>
<text text-anchor="start" x="1083.5" y="-769.2" font-family="Arial" font-size="11.00">&#45; analyticsId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-739 1078.5,-761 1274.5,-761 1274.5,-739 1078.5,-739"/>
<text text-anchor="start" x="1083.5" y="-747.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-717 1078.5,-739 1274.5,-739 1274.5,-717 1078.5,-717"/>
<text text-anchor="start" x="1083.5" y="-725.2" font-family="Arial" font-size="11.00">+ totalBooksRead : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-695 1078.5,-717 1274.5,-717 1274.5,-695 1078.5,-695"/>
<text text-anchor="start" x="1083.5" y="-703.2" font-family="Arial" font-size="11.00">+ averageRating : double</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-673 1078.5,-695 1274.5,-695 1274.5,-673 1078.5,-673"/>
<text text-anchor="start" x="1083.5" y="-681.2" font-family="Arial" font-size="11.00">+ readingTime : long</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-663 1078.5,-673 1274.5,-673 1274.5,-663 1078.5,-663"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-653 1078.5,-663 1274.5,-663 1274.5,-653 1078.5,-653"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-631 1078.5,-653 1274.5,-653 1274.5,-631 1078.5,-631"/>
<text text-anchor="start" x="1083.5" y="-639.2" font-family="Arial" font-size="11.00">+ Analytics(readerId: String) : Analytics</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1078.5,-609 1078.5,-631 1274.5,-631 1274.5,-609 1078.5,-609"/>
<text text-anchor="start" x="1083.5" y="-617.2" font-family="Arial" font-size="11.00">+ generateReport() : String</text>
<polygon fill="black" stroke="black" points="1077.5,-793 1077.5,-793 1275.5,-793 1275.5,-793 1077.5,-793"/>
<polygon fill="black" stroke="black" points="1077.5,-663 1077.5,-663 1275.5,-663 1275.5,-663 1077.5,-663"/>
<path fill="none" stroke="black" d="M1089.5,-608C1089.5,-608 1263.5,-608 1263.5,-608 1269.5,-608 1275.5,-614 1275.5,-620 1275.5,-620 1275.5,-804 1275.5,-804 1275.5,-810 1269.5,-816 1263.5,-816 1263.5,-816 1089.5,-816 1089.5,-816 1083.5,-816 1077.5,-810 1077.5,-804 1077.5,-804 1077.5,-620 1077.5,-620 1077.5,-614 1083.5,-608 1089.5,-608"/>
</g>
<!-- Reader&#45;&gt;Analytics -->
<g id="edge14" class="edge">
<title>Reader&#45;&gt;Analytics</title>
<path fill="none" stroke="#4a4a4a" d="M1210.25,-905.78C1210.25,-905.78 1210.25,-830.11 1210.25,-830.11"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="1213.75,-830.11 1210.25,-820.11 1206.75,-830.11 1213.75,-830.11"/>
<text text-anchor="middle" x="1207.25" y="-822.91" font-family="Arial" font-size="9.00">1</text>
<text text-anchor="middle" x="1207.25" y="-898.58" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Subscription -->
<g id="node14" class="node">
<title>Subscription</title>
<path fill="#e8e8e8" stroke="transparent" d="M1479.5,-608C1479.5,-608 1771.5,-608 1771.5,-608 1777.5,-608 1783.5,-614 1783.5,-620 1783.5,-620 1783.5,-804 1783.5,-804 1783.5,-810 1777.5,-816 1771.5,-816 1771.5,-816 1479.5,-816 1479.5,-816 1473.5,-816 1467.5,-810 1467.5,-804 1467.5,-804 1467.5,-620 1467.5,-620 1467.5,-614 1473.5,-608 1479.5,-608"/>
<polygon fill="#bebebe" stroke="transparent" points="1468.5,-793 1468.5,-815 1782.5,-815 1782.5,-793 1468.5,-793"/>
<text text-anchor="start" x="1591.5" y="-802.2" font-family="Arial" font-weight="bold" font-size="11.00">Subscription</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-783 1468.5,-793 1782.5,-793 1782.5,-783 1468.5,-783"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-761 1468.5,-783 1782.5,-783 1782.5,-761 1468.5,-761"/>
<text text-anchor="start" x="1473.5" y="-769.2" font-family="Arial" font-size="11.00">&#45; subscriptionId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-739 1468.5,-761 1782.5,-761 1782.5,-739 1468.5,-739"/>
<text text-anchor="start" x="1473.5" y="-747.2" font-family="Arial" font-size="11.00">+ readerId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-717 1468.5,-739 1782.5,-739 1782.5,-717 1468.5,-717"/>
<text text-anchor="start" x="1473.5" y="-725.2" font-family="Arial" font-size="11.00">+ planType : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-695 1468.5,-717 1782.5,-717 1782.5,-695 1468.5,-695"/>
<text text-anchor="start" x="1473.5" y="-703.2" font-family="Arial" font-size="11.00">+ monthlyFee : double</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-673 1468.5,-695 1782.5,-695 1782.5,-673 1468.5,-673"/>
<text text-anchor="start" x="1473.5" y="-681.2" font-family="Arial" font-size="11.00">+ accessLevel : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-663 1468.5,-673 1782.5,-673 1782.5,-663 1468.5,-663"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-653 1468.5,-663 1782.5,-663 1782.5,-653 1468.5,-653"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-631 1468.5,-653 1782.5,-653 1782.5,-631 1468.5,-631"/>
<text text-anchor="start" x="1473.5" y="-639.2" font-family="Arial" font-size="11.00">+ Subscription(readerId: String, planType: String) : Subscription</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1468.5,-609 1468.5,-631 1782.5,-631 1782.5,-609 1468.5,-609"/>
<text text-anchor="start" x="1473.5" y="-617.2" font-family="Arial" font-size="11.00">+ upgradeAccess(newLevel: String) : void</text>
<polygon fill="black" stroke="black" points="1467.5,-793 1467.5,-793 1783.5,-793 1783.5,-793 1467.5,-793"/>
<polygon fill="black" stroke="black" points="1467.5,-663 1467.5,-663 1783.5,-663 1783.5,-663 1467.5,-663"/>
<path fill="none" stroke="black" d="M1479.5,-608C1479.5,-608 1771.5,-608 1771.5,-608 1777.5,-608 1783.5,-614 1783.5,-620 1783.5,-620 1783.5,-804 1783.5,-804 1783.5,-810 1777.5,-816 1771.5,-816 1771.5,-816 1479.5,-816 1479.5,-816 1473.5,-816 1467.5,-810 1467.5,-804 1467.5,-804 1467.5,-620 1467.5,-620 1467.5,-614 1473.5,-608 1479.5,-608"/>
</g>
<!-- Reader&#45;&gt;Subscription -->
<g id="edge15" class="edge">
<title>Reader&#45;&gt;Subscription</title>
<path fill="none" stroke="#4a4a4a" d="M1369.17,-905.78C1369.17,-817.32 1369.17,-712 1369.17,-712 1369.17,-712 1449.18,-712 1449.18,-712"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="1449.18,-715.5 1459.18,-712 1449.18,-708.5 1449.18,-715.5"/>
<text text-anchor="middle" x="1456.18" y="-714.8" font-family="Arial" font-size="9.00">1</text>
<text text-anchor="middle" x="1366.17" y="-898.58" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- DigitalBook -->
<g id="node3" class="node">
<title>DigitalBook</title>
<path fill="#e8e8e8" stroke="transparent" d="M638,-306C638,-306 873,-306 873,-306 879,-306 885,-312 885,-318 885,-318 885,-502 885,-502 885,-508 879,-514 873,-514 873,-514 638,-514 638,-514 632,-514 626,-508 626,-502 626,-502 626,-318 626,-318 626,-312 632,-306 638,-306"/>
<polygon fill="#bebebe" stroke="transparent" points="627.5,-491 627.5,-513 884.5,-513 884.5,-491 627.5,-491"/>
<text text-anchor="start" x="725" y="-500.2" font-family="Arial" font-weight="bold" font-size="11.00">DigitalBook</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-481 627.5,-491 884.5,-491 884.5,-481 627.5,-481"/>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-459 627.5,-481 884.5,-481 884.5,-459 627.5,-459"/>
<text text-anchor="start" x="632.5" y="-467.2" font-family="Arial" font-size="11.00">&#45; bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-437 627.5,-459 884.5,-459 884.5,-437 627.5,-437"/>
<text text-anchor="start" x="632.5" y="-445.2" font-family="Arial" font-size="11.00">+ title : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-415 627.5,-437 884.5,-437 884.5,-415 627.5,-415"/>
<text text-anchor="start" x="632.5" y="-423.2" font-family="Arial" font-size="11.00">+ isbn : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-393 627.5,-415 884.5,-415 884.5,-393 627.5,-393"/>
<text text-anchor="start" x="632.5" y="-401.2" font-family="Arial" font-size="11.00">+ fileFormat : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-371 627.5,-393 884.5,-393 884.5,-371 627.5,-371"/>
<text text-anchor="start" x="632.5" y="-379.2" font-family="Arial" font-size="11.00">+ fileSize : long</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-361 627.5,-371 884.5,-371 884.5,-361 627.5,-361"/>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-351 627.5,-361 884.5,-361 884.5,-351 627.5,-351"/>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-329 627.5,-351 884.5,-351 884.5,-329 627.5,-329"/>
<text text-anchor="start" x="632.5" y="-337.2" font-family="Arial" font-size="11.00">+ DigitalBook(title: String, isbn: String) : DigitalBook</text>
<polygon fill="#e8e8e8" stroke="transparent" points="627.5,-307 627.5,-329 884.5,-329 884.5,-307 627.5,-307"/>
<text text-anchor="start" x="632.5" y="-315.2" font-family="Arial" font-size="11.00">+ download(readerId: String) : String</text>
<polygon fill="black" stroke="black" points="626.5,-491 626.5,-491 885.5,-491 885.5,-491 626.5,-491"/>
<polygon fill="black" stroke="black" points="626.5,-361 626.5,-361 885.5,-361 885.5,-361 626.5,-361"/>
<path fill="none" stroke="black" d="M638,-306C638,-306 873,-306 873,-306 879,-306 885,-312 885,-318 885,-318 885,-502 885,-502 885,-508 879,-514 873,-514 873,-514 638,-514 638,-514 632,-514 626,-508 626,-502 626,-502 626,-318 626,-318 626,-312 632,-306 638,-306"/>
</g>
<!-- BorrowRecord&#45;&gt;DigitalBook -->
<g id="edge2" class="edge">
<title>BorrowRecord&#45;&gt;DigitalBook</title>
<path fill="none" stroke="#4a4a4a" d="M587.5,-603.81C587.5,-556.68 587.5,-512 587.5,-512 587.5,-512 607.92,-512 607.92,-512"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="607.92,-515.5 617.92,-512 607.92,-508.5 607.92,-515.5"/>
<text text-anchor="middle" x="614.92" y="-514.8" font-family="Arial" font-size="9.00">1</text>
<text text-anchor="middle" x="585.5" y="-596.61" font-family="Arial" font-size="9.00">*</text>
</g>
<!-- BookCollection -->
<g id="node6" class="node">
<title>BookCollection</title>
<path fill="#e8e8e8" stroke="transparent" d="M20,-4C20,-4 339,-4 339,-4 345,-4 351,-10 351,-16 351,-16 351,-200 351,-200 351,-206 345,-212 339,-212 339,-212 20,-212 20,-212 14,-212 8,-206 8,-200 8,-200 8,-16 8,-16 8,-10 14,-4 20,-4"/>
<polygon fill="#bebebe" stroke="transparent" points="9.5,-189 9.5,-211 350.5,-211 350.5,-189 9.5,-189"/>
<text text-anchor="start" x="139" y="-198.2" font-family="Arial" font-weight="bold" font-size="11.00">BookCollection</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-179 9.5,-189 350.5,-189 350.5,-179 9.5,-179"/>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-157 9.5,-179 350.5,-179 350.5,-157 9.5,-157"/>
<text text-anchor="start" x="14.5" y="-165.2" font-family="Arial" font-size="11.00">&#45; relationId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-135 9.5,-157 350.5,-157 350.5,-135 9.5,-135"/>
<text text-anchor="start" x="14.5" y="-143.2" font-family="Arial" font-size="11.00">+ collectionId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-113 9.5,-135 350.5,-135 350.5,-113 9.5,-113"/>
<text text-anchor="start" x="14.5" y="-121.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-91 9.5,-113 350.5,-113 350.5,-91 9.5,-91"/>
<text text-anchor="start" x="14.5" y="-99.2" font-family="Arial" font-size="11.00">+ addedDate : Date</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-69 9.5,-91 350.5,-91 350.5,-69 9.5,-69"/>
<text text-anchor="start" x="14.5" y="-77.2" font-family="Arial" font-size="11.00">+ priority : int</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-59 9.5,-69 350.5,-69 350.5,-59 9.5,-59"/>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-49 9.5,-59 350.5,-59 350.5,-49 9.5,-49"/>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-27 9.5,-49 350.5,-49 350.5,-27 9.5,-27"/>
<text text-anchor="start" x="14.5" y="-35.2" font-family="Arial" font-size="11.00">+ BookCollection(collectionId: String, bookId: String) : BookCollection</text>
<polygon fill="#e8e8e8" stroke="transparent" points="9.5,-5 9.5,-27 350.5,-27 350.5,-5 9.5,-5"/>
<text text-anchor="start" x="14.5" y="-13.2" font-family="Arial" font-size="11.00">+ setPriority(priority: int) : void</text>
<polygon fill="black" stroke="black" points="8.5,-189 8.5,-189 351.5,-189 351.5,-189 8.5,-189"/>
<polygon fill="black" stroke="black" points="8.5,-59 8.5,-59 351.5,-59 351.5,-59 8.5,-59"/>
<path fill="none" stroke="black" d="M20,-4C20,-4 339,-4 339,-4 345,-4 351,-10 351,-16 351,-16 351,-200 351,-200 351,-206 345,-212 339,-212 339,-212 20,-212 20,-212 14,-212 8,-206 8,-200 8,-200 8,-16 8,-16 8,-10 14,-4 20,-4"/>
</g>
<!-- DigitalBook&#45;&gt;BookCollection -->
<g id="edge5" class="edge">
<title>DigitalBook&#45;&gt;BookCollection</title>
<path fill="none" stroke="#4a4a4a" d="M617.85,-307C501.03,-307 352.25,-307 352.25,-307 352.25,-307 352.25,-226.24 352.25,-226.24"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="355.75,-226.24 352.25,-216.24 348.75,-226.24 355.75,-226.24"/>
<text text-anchor="middle" x="350.25" y="-219.04" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="614.85" y="-309.8" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- SearchResult -->
<g id="node8" class="node">
<title>SearchResult</title>
<path fill="#e8e8e8" stroke="transparent" d="M437.5,-4C437.5,-4 717.5,-4 717.5,-4 723.5,-4 729.5,-10 729.5,-16 729.5,-16 729.5,-200 729.5,-200 729.5,-206 723.5,-212 717.5,-212 717.5,-212 437.5,-212 437.5,-212 431.5,-212 425.5,-206 425.5,-200 425.5,-200 425.5,-16 425.5,-16 425.5,-10 431.5,-4 437.5,-4"/>
<polygon fill="#bebebe" stroke="transparent" points="426.5,-189 426.5,-211 728.5,-211 728.5,-189 426.5,-189"/>
<text text-anchor="start" x="542" y="-198.2" font-family="Arial" font-weight="bold" font-size="11.00">SearchResult</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-179 426.5,-189 728.5,-189 728.5,-179 426.5,-179"/>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-157 426.5,-179 728.5,-179 728.5,-157 426.5,-157"/>
<text text-anchor="start" x="431.5" y="-165.2" font-family="Arial" font-size="11.00">&#45; resultId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-135 426.5,-157 728.5,-157 728.5,-135 426.5,-135"/>
<text text-anchor="start" x="431.5" y="-143.2" font-family="Arial" font-size="11.00">+ query : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-113 426.5,-135 728.5,-135 728.5,-113 426.5,-113"/>
<text text-anchor="start" x="431.5" y="-121.2" font-family="Arial" font-size="11.00">+ bookId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-91 426.5,-113 728.5,-113 728.5,-91 426.5,-91"/>
<text text-anchor="start" x="431.5" y="-99.2" font-family="Arial" font-size="11.00">+ relevanceScore : double</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-69 426.5,-91 728.5,-91 728.5,-69 426.5,-69"/>
<text text-anchor="start" x="431.5" y="-77.2" font-family="Arial" font-size="11.00">+ timestamp : Date</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-59 426.5,-69 728.5,-69 728.5,-59 426.5,-59"/>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-49 426.5,-59 728.5,-59 728.5,-49 426.5,-49"/>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-27 426.5,-49 728.5,-49 728.5,-27 426.5,-27"/>
<text text-anchor="start" x="431.5" y="-35.2" font-family="Arial" font-size="11.00">+ SearchResult(query: String, bookId: String) : SearchResult</text>
<polygon fill="#e8e8e8" stroke="transparent" points="426.5,-5 426.5,-27 728.5,-27 728.5,-5 426.5,-5"/>
<text text-anchor="start" x="431.5" y="-13.2" font-family="Arial" font-size="11.00">+ calculateRelevance() : double</text>
<polygon fill="black" stroke="black" points="425.5,-189 425.5,-189 729.5,-189 729.5,-189 425.5,-189"/>
<polygon fill="black" stroke="black" points="425.5,-59 425.5,-59 729.5,-59 729.5,-59 425.5,-59"/>
<path fill="none" stroke="black" d="M437.5,-4C437.5,-4 717.5,-4 717.5,-4 723.5,-4 729.5,-10 729.5,-16 729.5,-16 729.5,-200 729.5,-200 729.5,-206 723.5,-212 717.5,-212 717.5,-212 437.5,-212 437.5,-212 431.5,-212 425.5,-206 425.5,-200 425.5,-200 425.5,-16 425.5,-16 425.5,-10 431.5,-4 437.5,-4"/>
</g>
<!-- DigitalBook&#45;&gt;SearchResult -->
<g id="edge7" class="edge">
<title>DigitalBook&#45;&gt;SearchResult</title>
<path fill="none" stroke="#4a4a4a" d="M677.75,-301.82C677.75,-301.82 677.75,-226.18 677.75,-226.18"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="681.25,-226.18 677.75,-216.18 674.25,-226.18 681.25,-226.18"/>
<text text-anchor="middle" x="675.75" y="-218.98" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="674.75" y="-294.62" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- DigitalBook&#45;&gt;Review -->
<g id="edge9" class="edge">
<title>DigitalBook&#45;&gt;Review</title>
<path fill="none" stroke="#4a4a4a" d="M893.13,-410C1041.52,-410 1256.75,-410 1256.75,-410 1256.75,-410 1256.75,-226.18 1256.75,-226.18"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="1260.25,-226.18 1256.75,-216.18 1253.25,-226.18 1260.25,-226.18"/>
<text text-anchor="middle" x="1254.75" y="-218.98" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="896.13" y="-412.8" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- DigitalBook&#45;&gt;ReadingProgress -->
<g id="edge13" class="edge">
<title>DigitalBook&#45;&gt;ReadingProgress</title>
<path fill="none" stroke="#4a4a4a" d="M844.5,-301.82C844.5,-301.82 844.5,-226.18 844.5,-226.18"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="848,-226.18 844.5,-216.18 841,-226.18 848,-226.18"/>
<text text-anchor="middle" x="842.5" y="-218.98" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="841.5" y="-294.62" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Author -->
<g id="node4" class="node">
<title>Author</title>
<path fill="#e8e8e8" stroke="transparent" d="M694,-619C694,-619 873,-619 873,-619 879,-619 885,-625 885,-631 885,-631 885,-793 885,-793 885,-799 879,-805 873,-805 873,-805 694,-805 694,-805 688,-805 682,-799 682,-793 682,-793 682,-631 682,-631 682,-625 688,-619 694,-619"/>
<polygon fill="#bebebe" stroke="transparent" points="683.5,-782 683.5,-804 884.5,-804 884.5,-782 683.5,-782"/>
<text text-anchor="start" x="765.5" y="-791.2" font-family="Arial" font-weight="bold" font-size="11.00">Author</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-772 683.5,-782 884.5,-782 884.5,-772 683.5,-772"/>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-750 683.5,-772 884.5,-772 884.5,-750 683.5,-750"/>
<text text-anchor="start" x="688.5" y="-758.2" font-family="Arial" font-size="11.00">&#45; authorId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-728 683.5,-750 884.5,-750 884.5,-728 683.5,-728"/>
<text text-anchor="start" x="688.5" y="-736.2" font-family="Arial" font-size="11.00">+ name : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-706 683.5,-728 884.5,-728 884.5,-706 683.5,-706"/>
<text text-anchor="start" x="688.5" y="-714.2" font-family="Arial" font-size="11.00">+ biography : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-684 683.5,-706 884.5,-706 884.5,-684 683.5,-684"/>
<text text-anchor="start" x="688.5" y="-692.2" font-family="Arial" font-size="11.00">+ nationality : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-674 683.5,-684 884.5,-684 884.5,-674 683.5,-674"/>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-664 683.5,-674 884.5,-674 884.5,-664 683.5,-664"/>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-642 683.5,-664 884.5,-664 884.5,-642 683.5,-642"/>
<text text-anchor="start" x="688.5" y="-650.2" font-family="Arial" font-size="11.00">+ Author(name: String) : Author</text>
<polygon fill="#e8e8e8" stroke="transparent" points="683.5,-620 683.5,-642 884.5,-642 884.5,-620 683.5,-620"/>
<text text-anchor="start" x="688.5" y="-628.2" font-family="Arial" font-size="11.00">+ publishBook(title: String) : DigitalBook</text>
<polygon fill="black" stroke="black" points="682.5,-782 682.5,-782 885.5,-782 885.5,-782 682.5,-782"/>
<polygon fill="black" stroke="black" points="682.5,-674 682.5,-674 885.5,-674 885.5,-674 682.5,-674"/>
<path fill="none" stroke="black" d="M694,-619C694,-619 873,-619 873,-619 879,-619 885,-625 885,-631 885,-631 885,-793 885,-793 885,-799 879,-805 873,-805 873,-805 694,-805 694,-805 688,-805 682,-799 682,-793 682,-793 682,-631 682,-631 682,-625 688,-619 694,-619"/>
</g>
<!-- Author&#45;&gt;DigitalBook -->
<g id="edge3" class="edge">
<title>Author&#45;&gt;DigitalBook</title>
<path fill="none" stroke="#4a4a4a" d="M783.5,-614.78C783.5,-614.78 783.5,-528.03 783.5,-528.03"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="787,-528.03 783.5,-518.03 780,-528.03 787,-528.03"/>
<text text-anchor="middle" x="781.5" y="-520.83" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="780.5" y="-607.58" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- Collection -->
<g id="node5" class="node">
<title>Collection</title>
<path fill="#e8e8e8" stroke="transparent" d="M94,-306C94,-306 265,-306 265,-306 271,-306 277,-312 277,-318 277,-318 277,-502 277,-502 277,-508 271,-514 265,-514 265,-514 94,-514 94,-514 88,-514 82,-508 82,-502 82,-502 82,-318 82,-318 82,-312 88,-306 94,-306"/>
<polygon fill="#bebebe" stroke="transparent" points="83.5,-491 83.5,-513 276.5,-513 276.5,-491 83.5,-491"/>
<text text-anchor="start" x="153" y="-500.2" font-family="Arial" font-weight="bold" font-size="11.00">Collection</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-481 83.5,-491 276.5,-491 276.5,-481 83.5,-481"/>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-459 83.5,-481 276.5,-481 276.5,-459 83.5,-459"/>
<text text-anchor="start" x="88.5" y="-467.2" font-family="Arial" font-size="11.00">&#45; collectionId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-437 83.5,-459 276.5,-459 276.5,-437 83.5,-437"/>
<text text-anchor="start" x="88.5" y="-445.2" font-family="Arial" font-size="11.00">+ name : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-415 83.5,-437 276.5,-437 276.5,-415 83.5,-415"/>
<text text-anchor="start" x="88.5" y="-423.2" font-family="Arial" font-size="11.00">+ description : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-393 83.5,-415 276.5,-415 276.5,-393 83.5,-393"/>
<text text-anchor="start" x="88.5" y="-401.2" font-family="Arial" font-size="11.00">+ theme : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-371 83.5,-393 276.5,-393 276.5,-371 83.5,-371"/>
<text text-anchor="start" x="88.5" y="-379.2" font-family="Arial" font-size="11.00">+ isPublic : boolean</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-361 83.5,-371 276.5,-371 276.5,-361 83.5,-361"/>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-351 83.5,-361 276.5,-361 276.5,-351 83.5,-351"/>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-329 83.5,-351 276.5,-351 276.5,-329 83.5,-329"/>
<text text-anchor="start" x="88.5" y="-337.2" font-family="Arial" font-size="11.00">+ Collection(name: String) : Collection</text>
<polygon fill="#e8e8e8" stroke="transparent" points="83.5,-307 83.5,-329 276.5,-329 276.5,-307 83.5,-307"/>
<text text-anchor="start" x="88.5" y="-315.2" font-family="Arial" font-size="11.00">+ addBook(bookId: String) : void</text>
<polygon fill="black" stroke="black" points="82.5,-491 82.5,-491 277.5,-491 277.5,-491 82.5,-491"/>
<polygon fill="black" stroke="black" points="82.5,-361 82.5,-361 277.5,-361 277.5,-361 82.5,-361"/>
<path fill="none" stroke="black" d="M94,-306C94,-306 265,-306 265,-306 271,-306 277,-312 277,-318 277,-318 277,-502 277,-502 277,-508 271,-514 265,-514 265,-514 94,-514 94,-514 88,-514 82,-508 82,-502 82,-502 82,-318 82,-318 82,-312 88,-306 94,-306"/>
</g>
<!-- Collection&#45;&gt;BookCollection -->
<g id="edge4" class="edge">
<title>Collection&#45;&gt;BookCollection</title>
<path fill="none" stroke="#4a4a4a" d="M179.5,-289.82C179.5,-289.82 179.5,-226.18 179.5,-226.18"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="179.5,-228.18 175.5,-222.18 179.5,-216.18 183.5,-222.18 179.5,-228.18"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="176,-291.82 179.5,-301.82 183,-291.82 176,-291.82"/>
<text text-anchor="middle" x="177.5" y="-294.62" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="176.5" y="-218.98" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- SearchEngine -->
<g id="node7" class="node">
<title>SearchEngine</title>
<path fill="#e8e8e8" stroke="transparent" d="M365.5,-317C365.5,-317 539.5,-317 539.5,-317 545.5,-317 551.5,-323 551.5,-329 551.5,-329 551.5,-491 551.5,-491 551.5,-497 545.5,-503 539.5,-503 539.5,-503 365.5,-503 365.5,-503 359.5,-503 353.5,-497 353.5,-491 353.5,-491 353.5,-329 353.5,-329 353.5,-323 359.5,-317 365.5,-317"/>
<polygon fill="#bebebe" stroke="transparent" points="354.5,-480 354.5,-502 550.5,-502 550.5,-480 354.5,-480"/>
<text text-anchor="start" x="415.5" y="-489.2" font-family="Arial" font-weight="bold" font-size="11.00">SearchEngine</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-470 354.5,-480 550.5,-480 550.5,-470 354.5,-470"/>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-448 354.5,-470 550.5,-470 550.5,-448 354.5,-448"/>
<text text-anchor="start" x="359.5" y="-456.2" font-family="Arial" font-size="11.00">&#45; engineId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-426 354.5,-448 550.5,-448 550.5,-426 354.5,-426"/>
<text text-anchor="start" x="359.5" y="-434.2" font-family="Arial" font-size="11.00">+ indexSize : long</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-404 354.5,-426 550.5,-426 550.5,-404 354.5,-404"/>
<text text-anchor="start" x="359.5" y="-412.2" font-family="Arial" font-size="11.00">+ lastUpdated : Date</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-382 354.5,-404 550.5,-404 550.5,-382 354.5,-382"/>
<text text-anchor="start" x="359.5" y="-390.2" font-family="Arial" font-size="11.00">+ isOnline : boolean</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-372 354.5,-382 550.5,-382 550.5,-372 354.5,-372"/>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-362 354.5,-372 550.5,-372 550.5,-362 354.5,-362"/>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-340 354.5,-362 550.5,-362 550.5,-340 354.5,-340"/>
<text text-anchor="start" x="359.5" y="-348.2" font-family="Arial" font-size="11.00">+ SearchEngine() : SearchEngine</text>
<polygon fill="#e8e8e8" stroke="transparent" points="354.5,-318 354.5,-340 550.5,-340 550.5,-318 354.5,-318"/>
<text text-anchor="start" x="359.5" y="-326.2" font-family="Arial" font-size="11.00">+ search(query: String) : SearchResult</text>
<polygon fill="black" stroke="black" points="353.5,-480 353.5,-480 551.5,-480 551.5,-480 353.5,-480"/>
<polygon fill="black" stroke="black" points="353.5,-372 353.5,-372 551.5,-372 551.5,-372 353.5,-372"/>
<path fill="none" stroke="black" d="M365.5,-317C365.5,-317 539.5,-317 539.5,-317 545.5,-317 551.5,-323 551.5,-329 551.5,-329 551.5,-491 551.5,-491 551.5,-497 545.5,-503 539.5,-503 539.5,-503 365.5,-503 365.5,-503 359.5,-503 353.5,-497 353.5,-491 353.5,-491 353.5,-329 353.5,-329 353.5,-323 359.5,-317 365.5,-317"/>
</g>
<!-- SearchEngine&#45;&gt;SearchResult -->
<g id="edge6" class="edge">
<title>SearchEngine&#45;&gt;SearchResult</title>
<path fill="none" stroke="#4a4a4a" d="M488.5,-312.78C488.5,-312.78 488.5,-226.03 488.5,-226.03"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="492,-226.03 488.5,-216.03 485,-226.03 492,-226.03"/>
<text text-anchor="middle" x="486.5" y="-218.83" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="485.5" y="-305.58" font-family="Arial" font-size="9.00">1</text>
</g>
<!-- RecommendationEngine -->
<g id="node11" class="node">
<title>RecommendationEngine</title>
<path fill="#e8e8e8" stroke="transparent" d="M1870,-932C1870,-932 2201,-932 2201,-932 2207,-932 2213,-938 2213,-944 2213,-944 2213,-1106 2213,-1106 2213,-1112 2207,-1118 2201,-1118 2201,-1118 1870,-1118 1870,-1118 1864,-1118 1858,-1112 1858,-1106 1858,-1106 1858,-944 1858,-944 1858,-938 1864,-932 1870,-932"/>
<polygon fill="#bebebe" stroke="transparent" points="1859.5,-1095 1859.5,-1117 2212.5,-1117 2212.5,-1095 1859.5,-1095"/>
<text text-anchor="start" x="1971" y="-1104.2" font-family="Arial" font-weight="bold" font-size="11.00">RecommendationEngine</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-1085 1859.5,-1095 2212.5,-1095 2212.5,-1085 1859.5,-1085"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-1063 1859.5,-1085 2212.5,-1085 2212.5,-1063 1859.5,-1063"/>
<text text-anchor="start" x="1864.5" y="-1071.2" font-family="Arial" font-size="11.00">&#45; engineId : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-1041 1859.5,-1063 2212.5,-1063 2212.5,-1041 1859.5,-1041"/>
<text text-anchor="start" x="1864.5" y="-1049.2" font-family="Arial" font-size="11.00">+ algorithm : String</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-1019 1859.5,-1041 2212.5,-1041 2212.5,-1019 1859.5,-1019"/>
<text text-anchor="start" x="1864.5" y="-1027.2" font-family="Arial" font-size="11.00">+ accuracy : double</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-997 1859.5,-1019 2212.5,-1019 2212.5,-997 1859.5,-997"/>
<text text-anchor="start" x="1864.5" y="-1005.2" font-family="Arial" font-size="11.00">+ isActive : boolean</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-987 1859.5,-997 2212.5,-997 2212.5,-987 1859.5,-987"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-977 1859.5,-987 2212.5,-987 2212.5,-977 1859.5,-977"/>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-955 1859.5,-977 2212.5,-977 2212.5,-955 1859.5,-955"/>
<text text-anchor="start" x="1864.5" y="-963.2" font-family="Arial" font-size="11.00">+ RecommendationEngine(algorithm: String) : RecommendationEngine</text>
<polygon fill="#e8e8e8" stroke="transparent" points="1859.5,-933 1859.5,-955 2212.5,-955 2212.5,-933 1859.5,-933"/>
<text text-anchor="start" x="1864.5" y="-941.2" font-family="Arial" font-size="11.00">+ generateRecommendations(readerId: String) : Recommendation</text>
<polygon fill="black" stroke="black" points="1858.5,-1095 1858.5,-1095 2213.5,-1095 2213.5,-1095 1858.5,-1095"/>
<polygon fill="black" stroke="black" points="1858.5,-987 1858.5,-987 2213.5,-987 2213.5,-987 1858.5,-987"/>
<path fill="none" stroke="black" d="M1870,-932C1870,-932 2201,-932 2201,-932 2207,-932 2213,-938 2213,-944 2213,-944 2213,-1106 2213,-1106 2213,-1112 2207,-1118 2201,-1118 2201,-1118 1870,-1118 1870,-1118 1864,-1118 1858,-1112 1858,-1106 1858,-1106 1858,-944 1858,-944 1858,-938 1864,-932 1870,-932"/>
</g>
<!-- RecommendationEngine&#45;&gt;Recommendation -->
<g id="edge10" class="edge">
<title>RecommendationEngine&#45;&gt;Recommendation</title>
<path fill="none" stroke="#4a4a4a" d="M2097.33,-927.68C2097.33,-927.68 2097.33,-830.16 2097.33,-830.16"/>
<polygon fill="#4a4a4a" stroke="#4a4a4a" points="2100.83,-830.16 2097.33,-820.16 2093.83,-830.16 2100.83,-830.16"/>
<text text-anchor="middle" x="2095.33" y="-822.96" font-family="Arial" font-size="9.00">*</text>
<text text-anchor="middle" x="2094.33" y="-920.48" font-family="Arial" font-size="9.00">1</text>
</g>
</g>
</svg>