$ ~. G2 I% j6 i$ _/ d+ {@app.get( % s1 P' Z+ {2 o" E4 R "/COVID19News/",9 v! g4 D; z# P0 R& T1 R
response_model=List[schemas.COVID19News], 6 l, M/ ] \' u z& ]' S tags=['新冠病毒新闻语料库数据接口'] : [ z0 B* K7 U)7 u E* y, H$ h2 e5 a7 g& A
def get_COVID19_news(db: Session = Depends(get_db)):( r8 I% ~8 ^$ ~- Q7 A" g
db_reviews = crud.get_COVID19_news(db) 2 C- ~. V3 n+ G% H1 q$ ` return db_reviews / Z; D: j9 X, q5 T5 S4 t! _" |! r7 |- X$ H" A' }
$ G; ?. Q9 F6 Z/ o- {' J2 W
# 为每个用户设置uuid标识符,并存入Cookie4 s, w% |, J5 |/ T- {5 L
def create_user_uuid_and_set_cookie(response: Response): - R; h9 l3 z- K0 L" I user_uuid = str(uuid.uuid1()) " n) W# J# \1 M1 N+ S `# A7 x response.set_cookie(key="user_uuid", value=user_uuid) 7 i! H1 j0 M! t% q! o return user_uuid4 g& u2 b) W, q
) J: L) _9 u1 y' v( K( f, h& a3 J! Y: S
@app.post( y! n5 m0 Z) e8 U2 f
"/calculate/preprocessing/"," [. P! X2 \6 s1 p7 \$ ^
tags=["计算模块数据接口"] & E4 @0 s6 N. Q)4 g+ G- v5 T% A* D9 h+ l3 j- ]
async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams, * p" e: t' ~( ^! u( X# ? background_task: BackgroundTasks,0 M4 L% a5 ^3 C0 e# a# T
response: Response, + U, D1 d+ r3 [3 @8 D) G user_uuid: str = Cookie(None)):) l1 Z v2 ~; w4 F
if not user_uuid: # d. [! l/ h2 ?! m3 y user_uuid = create_user_uuid_and_set_cookie(response) " u2 p! l0 r7 _, b% J / l# u9 K' M$ W4 H3 k global topic_model_training_tasks 1 |6 m. m; t" D task = TopicModelTrainingTask(text_preprocessing_params) : U5 O* [. o0 G3 P% M1 g+ p topic_model_training_tasks[user_uuid] = task , X& F) y3 ^$ A1 d* o. |' M& R6 y9 l' D! r( w
background_task.add_task(task.preprocessing) 6 s2 C$ g8 j7 j4 f: a3 V1 q return {"message": "已添加文本预处理后台任务"} 7 [1 d( d3 E+ c b* r* a/ w9 \7 Y # }" o8 G: d5 @; c/ Y3 r) f6 w8 o6 R* w- [: ^3 n0 u) k
@app.post(9 ?5 v; g$ ]2 }( Q: s: v
"/calculate/nmftraining/",6 S4 `) g2 `0 H- q I
tags=["计算模块数据接口"]8 c9 j; Y, K7 l
) " Q. f, U: a# U3 Y& c2 Casync def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams,8 ]2 x2 U3 o- l) ?6 K3 r3 h
background_task: BackgroundTasks, 3 K6 b: a3 r3 c' C response: Response, : x4 ^7 z3 I" b3 L* ~ user_uuid: str = Cookie(None)):" d, ~' V. @& @) B/ C1 \7 U
if not user_uuid: 5 W3 r+ g0 E- L9 X2 y* ~9 } user_uuid = create_user_uuid_and_set_cookie(response) $ A" A3 D7 n0 j0 c7 A D/ r. G: ~7 Z4 i9 w global topic_model_training_tasks 2 T/ [3 O% M% P% f& @* {8 o2 ?: }, K) U8 v) o
if user_uuid and user_uuid in topic_model_training_tasks:. N# l0 Q& ]- Y
task = topic_model_training_tasks[user_uuid]+ u3 P+ w' ]. h3 I
if task.text_preprocessing_progress.status_code == 2:3 J0 m3 |, A% X! s2 T+ w
background_task.add_task(task.nmf_training, nmf_training_params) 8 l$ W5 Y B" Y2 U return {"message": "已添加NMF主题模型训练后台任务"} % z% d) g/ q. S, I else:2 u3 q$ @1 v7 ?/ [% ]0 d( k
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")# A. s& i w2 k3 ] c6 X
else:" Y' E0 e; I' s* n; Y$ w' J
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 3 D4 x. \, A7 b* p& ~: J ) v, g5 I, r/ s: u7 K3 B3 _. d- O i% [3 @! R
@app.get( ' F' z, B) f# R2 c "/calculate/nmftraining/keywordsearch/", , z v. u& D! v* U; Z response_model=KeywordSearchResult,7 ~8 L9 ]; s# C* i; t4 R# Z
tags=["用户交互"] ( y, P2 [, V2 D3 h4 y; A: e)0 C, p) @! S$ ?* B
async def search_keyword(search_text: str, - ]9 [- | b+ }- d! h" E" U+ T response: Response, / i" d4 v3 w8 @. C9 t7 |* a- ` user_uuid: str = Cookie(None)):( l0 J s& P9 a
if not user_uuid:- l: O$ E- c& G9 [' W
user_uuid = create_user_uuid_and_set_cookie(response)) q7 H9 @: f2 l8 g8 h& O
/ x4 c R, r" L
global topic_model_training_tasks ! T- j1 B1 \, Z. X, O2 v7 o% ^, a& v+ x1 H- N8 E& e1 V
if user_uuid and user_uuid in topic_model_training_tasks: ! o, Z' x, m Z9 o9 c. N task = topic_model_training_tasks[user_uuid] 9 j$ o) q' ?# L% C3 Y if task.text_preprocessing_progress.status_code == 2:( T9 H- x# V ?" j0 ?
search_text = search_text.lower() % v8 q0 Q" @ f0 ~) _9 B4 ] bag_words = task.text_preprocessing.bagWords : Y. }3 z u0 G. S keyword_search_result = KeywordSearchResult() 0 V/ L8 i/ |+ b% b9 T. L% v! U- Z for wi, word in enumerate(bag_words):: u3 }" z9 ~9 e4 |
if search_text in word: / ^' D; ]8 \* U- N0 v4 m* H$ c keyword_search_result.word_id_list.append(wi)* v$ o, h& e" [3 U
keyword_search_result.word_list.append(word)- I: D0 ~; L8 J; U5 W
return keyword_search_result( ?- Y$ A( [9 u \
else: $ f3 Z" S+ ]! u& K! r7 R$ B% @/ S. P; q raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")5 X- O" A3 {: v0 d% V- u( l
else: ! [1 [5 Z& ^: @; ^1 V! F raise HTTPException(status_code=404, detail="未找到相应的训练对象!")8 O/ I c, ?9 G7 ^+ b( Y: A; z+ ]
9 e' [. s) W) f- c
/ q1 M0 D- I4 f@app.post( $ @) J8 Y3 G% l4 \3 h2 H4 W( v( l9 }! y "/calculate/nmftraining/topickeywordoptimization/",/ D+ A0 f+ Q" p
tags=["用户交互"]! H8 E8 d4 n. K8 z% f$ F4 K
) 8 @/ X0 V# g; G4 P& t, r' U1 Kasync def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams, - O% V: }3 x0 Q: {' g8 ` background_task: BackgroundTasks,2 ~) t" X3 v2 i# s4 O; G/ J
response: Response, 6 I; p" Q* d' n8 F/ L( R0 @ user_uuid: str = Cookie(None)):; X* [% L; M7 h. Y8 z/ H+ e) U; T
if not user_uuid:$ S, d- V5 c- D! X" z% _# x/ u5 \
user_uuid = create_user_uuid_and_set_cookie(response)0 I, W! m& H |/ f/ x5 X
# M3 F7 _+ d( X+ K v+ s
global topic_model_training_tasks 7 Q% |" l7 e2 e7 I) X & o5 Y$ r3 J7 X0 h. I, Z if user_uuid and user_uuid in topic_model_training_tasks:2 R+ ?: M1 p: ]3 c B
task = topic_model_training_tasks[user_uuid] ' M2 @6 n2 N% L# F) P4 e2 C if task.nmf_training_progress.status_code == 2:9 N& d D+ U- G" m) H
background_task.add_task(task.topic_keyword_optimization, tko_params) ! {8 T: @# ~ o. Q3 m5 _& D return {"message": "已添加主题关键词优化后台任务"}' M1 h( h7 q8 k2 t; C" @% U0 z
else: 0 e- r, ~2 }# I/ s5 P0 ? raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 8 W5 i1 f# m$ |2 G2 A* E* O7 D else: " M$ n$ d2 h ~6 r raise HTTPException(status_code=404, detail="未找到相应的训练对象!"): z9 ?. R, w, A7 O9 V
3 G* L4 m. p9 I% Z, k* Q8 u& Z5 r" g1 P* j. K8 r7 Y/ Z
@app.post( - g/ P7 P8 ^8 n& F "/calculate/nmftraining/topicsplit/",- \' r( x- B# o4 h" b& q) g
tags=["用户交互"] ' n& S2 K% I' A7 \# o; ? c( H2 S3 S)& R) ?$ Y" D( e0 {
async def run_topic_split_task(ts_params: TopicSplitParams,) `9 n' `+ a$ N5 y' ^; D
background_task: BackgroundTasks, 9 c8 G! j2 v4 U" T response: Response, . w0 Z& E' [# \- K7 l0 X user_uuid: str = Cookie(None)): 4 E# m4 |5 `. v. m1 U7 I, U2 _ if not user_uuid: " t, m7 K6 }' u; f; _6 Y user_uuid = create_user_uuid_and_set_cookie(response)# p$ ^2 p7 d! n7 s1 E/ @+ x2 H* t% R
" ^; m+ K* |8 r+ m+ q7 I global topic_model_training_tasks' O4 G2 c# M+ a5 k8 N
+ l4 J: @" u9 H/ W
if user_uuid and user_uuid in topic_model_training_tasks: 2 r5 `" U( C: ?/ V task = topic_model_training_tasks[user_uuid], z& [; Z K3 L, U- Q
if task.nmf_training_progress.status_code == 2:, A* ~) }8 t1 h( t0 T
background_task.add_task(task.topic_split, ts_params) 3 R6 _; \& F1 o: C$ c return {"message": "已添加主题拆分后台任务"} & D% B: g1 l6 n( _ else:! J% M$ Z+ @8 J1 K
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")6 h) [7 Y8 Z+ l6 G% y! B8 w) u8 q; ^
else:4 C' ~0 f# |$ g* n6 _$ r3 u: c# W
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")- F, @; k5 k1 i7 i/ A
; B. b/ m1 y# W" b6 z
# b2 d6 f4 R9 |9 N I* C
@app.post( , O& E( Z+ ~# X- C/ g* W. z$ Z "/calculate/nmftraining/topicmerge/", 2 S# s2 T; Y; u* g5 _& H3 M tags=["用户交互"] # m6 t4 u* W% J, Y# g) * S9 s) x" X6 N4 Jasync def run_topic_merge_task(tm_params: TopicMergeParams, ( }! ? R S" f4 i2 {! I+ ~ background_task: BackgroundTasks, 1 L* ~( C; b+ x i% y# i% s response: Response,5 _2 U+ L& u7 L% r
user_uuid: str = Cookie(None)):4 x1 u, |2 ]- G4 @1 I$ J
if not user_uuid: % V8 q9 r0 U1 c$ M9 I user_uuid = create_user_uuid_and_set_cookie(response)! d- ~* F% A5 G: c3 H- k ?
4 p1 k+ v5 k: e3 l) {- L global topic_model_training_tasks* c% M! v% Y3 L5 C7 `: F9 \
' \5 U+ p# h% Z1 C/ H" | if user_uuid and user_uuid in topic_model_training_tasks: 9 {: U. n; @( g1 U task = topic_model_training_tasks[user_uuid]2 {: Y3 h1 ~7 T1 O, w4 f; c6 ~
if task.nmf_training_progress.status_code == 2:0 L' A( m0 _5 ]$ `" R# `6 c
background_task.add_task(task.topic_merge, tm_params) T5 T7 t: v: l( G, |
return {"message": "已添加主题合并后台任务"} * } U% V) X7 i h0 X+ F( s else:% a! A, E# c3 s1 s6 u. F7 ~2 ~
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") , p. l2 |1 O( L5 F else: 7 t2 D5 T' v2 U# D# ^0 d raise HTTPException(status_code=404, detail="未找到相应的训练对象!") # E' V3 t' p5 a; x " N f% m9 [" d: e8 d- \8 J ( v: U+ U7 }8 P D( b. N# q. ?7 p@app.post( ; D+ U- J% t' i# ]9 n "/calculate/nmftraining/keywordinducedtopiccreate/",# W1 m' V' Y- G
tags=["用户交互"], J/ R$ F' {" w, ^- B
) : ?. y7 c: T ~1 g- T$ lasync def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams,) N% e7 q. ~6 C, F; y
background_task: BackgroundTasks, + k! {& v( g/ ?, D& e* L- a+ @7 C! B response: Response, $ _' z6 l* f* b r user_uuid: str = Cookie(None)):; i9 e- f3 R' G6 D
if not user_uuid:6 G! n3 l0 X! X( W* }! c5 G
user_uuid = create_user_uuid_and_set_cookie(response)4 F9 @1 f' C: f$ v3 B0 a* x+ Q
; X2 h7 |; c5 k) m
global topic_model_training_tasks) r: a. M1 F% s$ D% C+ s& @0 Z8 V
- e4 I7 G/ U4 A# p if user_uuid and user_uuid in topic_model_training_tasks:" B+ b" g( y# t6 q7 V3 e3 s
task = topic_model_training_tasks[user_uuid] 2 { h" [3 w0 z4 { if task.nmf_training_progress.status_code == 2: 1 Z9 z/ A2 q' d4 |! J+ i background_task.add_task(task.keyword_induced_topic_create, kitc_params) ( I5 a' C( u4 _( _4 u5 ]# q) D, W return {"message": "已添加关键词诱导主题创建后台任务"}9 A% k3 w1 k( l- C
else: 4 Y: b7 Z0 j4 |" T raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")" V$ \6 L- m- m) H6 e
else:* L$ M1 M# v: r1 B! E
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ; p# V( u. n. I4 |9 Y. ]; }/ K a+ h" \' d+ k# V
1 F& o3 I/ d" `( P" v! P@app.post( 6 M$ } K9 P5 Q+ Y3 F3 ~ "/calculate/nmftraining/documentinducedtopiccreate/", ) I0 {: W1 g6 Q) w0 J+ h0 d" G tags=["用户交互"] 5 m$ i A/ o) u8 })) i3 i/ f8 E7 {; ?- i7 [
async def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams, : X5 Y* W& O" y6 G0 F/ f; t background_task: BackgroundTasks, % q- a) U/ F# J% R, ?8 N7 ?3 O$ d2 M response: Response,% \ ~/ O, A5 C7 g7 V
user_uuid: str = Cookie(None)):9 S+ e% X( G, n0 }* [ ~% y
if not user_uuid:; C# e- O) j' [; b6 a$ R- k7 g
user_uuid = create_user_uuid_and_set_cookie(response) $ A$ u# [1 t6 P% ]0 S/ C & @# q+ t* K* v G3 b) ` global topic_model_training_tasks * q" W) g# s& O+ L/ ?/ L3 z7 Z7 y; N& p$ e7 b
if user_uuid and user_uuid in topic_model_training_tasks: 0 Z% w J5 v- I; b+ K task = topic_model_training_tasks[user_uuid] 3 x$ Z1 z* ?' t* S/ M4 W if task.nmf_training_progress.status_code == 2:( ~7 F9 Y; w5 u% ?( p4 @
background_task.add_task(task.document_induced_topic_create, ditc_params) % X( D# t. `7 M) X: d2 k1 ] return {"message": "已添加文档诱导主题创建后台任务"} ! q% P( @* d+ G else: 2 A& K2 |* F7 O: g% ~0 G7 G7 x raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")0 x8 u1 Z/ E" n( x; P7 m3 _6 P
else:+ R I+ f& U* e
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") & f+ T" } ]+ {4 H " u; g, O5 [3 i% P" P3 D& j* T/ a; J! |$ j
@app.get( & ]5 {3 m; n& o! e' a4 ^ "/calculate/nmftraining/newdoctopicdistributionpredict/", ' w e7 q* f5 ?6 g3 s tags=["主题预测"] ' H F+ J8 Y/ E# L) D' M( G" L$ X3 t4 u; T* X% f# ]2 R
async def run_new_document_topic_distribution_predict_task( * f) t1 h. e" H. { new_doc_text: str, 1 R; p7 r0 j! M( g8 I& z% Z background_task: BackgroundTasks,: z1 Y% a0 c* ?, N2 s0 p* q) t
response: Response,' W' E' q9 {# _8 }. w t7 Z$ e- v
user_uuid: str = Cookie(None)): - p8 R1 v2 j) M' \ if not user_uuid:8 e7 Y! x# u/ o$ T: K1 N- Q. y3 y3 d \
user_uuid = create_user_uuid_and_set_cookie(response) ( v; [3 w# ]# Q$ d+ H0 c* F; I9 b! y2 n3 I& c
global topic_model_training_tasks 8 c' B5 @* ]9 Q" e; K& H8 d/ O) u 7 k) x/ P& G6 i% |2 n' w if user_uuid and user_uuid in topic_model_training_tasks:% s: b: k6 K \# o; Y
task = topic_model_training_tasks[user_uuid] * }1 D- `7 d6 H if task.nmf_training_progress.status_code == 2: # f; q5 S* i$ g' j9 O. p w background_task.add_task( 0 G2 B& s. ^' A! _- f task.new_doc_topic_distribution_predict, h* p& S/ e, {" P* T* Q9 B new_doc_text$ f* U) M1 D( w+ ^# w. ?
) 0 i. N. @- l. O return {"message": "已添加新文档主题分布预测后台任务"}5 D7 l" k2 y& m; q B' b
else:" P' V: s1 @: h, V! f8 t+ o
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")4 L, S& B! V6 I/ v6 a
else: / X8 e' ~. Z- P# w) [ raise HTTPException(status_code=404, detail="未找到相应的训练对象!")% @& e: H# R8 z
9 f1 p7 W( f: f/ a2 _! n# A {% f1 O# ~3 O( r7 F0 o
@app.get( & U0 O' y# N. c z4 ^ "/calculate/preprocessing/progress/",* R( B; k% B3 s7 F% Y
tags=["计算模块数据接口"], % s4 o k0 @( @, M8 m response_model=TextPreprocessingProgress ! R$ y3 h6 i$ h" o2 {4 |0 b( L)$ `7 G: S* G. a$ J9 I/ v; o$ T. U
def get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)): * U% t1 X/ I# y+ z7 F& e2 m' l1 l/ n global topic_model_training_tasks - f9 V: V# N ? 7 K/ N) M0 T- r d if (not user_uuid) or (user_uuid not in topic_model_training_tasks): - {3 B0 [, ^) H: U" T raise HTTPException(status_code=404, detail="未找到相应的训练对象!")/ Q# L! n2 ^9 D) _/ j7 c
return topic_model_training_tasks[user_uuid].text_preprocessing_progress ! d+ Y. U. S$ F% Y$ N 7 W: C6 B4 P+ E ) }7 p9 {4 W( V8 P@app.get(+ |# y. G, [+ U2 @7 w
"/calculate/nmftraining/progress/", 7 I- g8 }: ] Q$ O+ q5 x- e tags=["计算模块数据接口"], 7 n) | `7 z1 ]6 l9 [. Z response_model=NMFTrainingProgress ' }' q; `, o& O), A7 ^3 t" A% [8 a
def get_nmf_training_task_progress(user_uuid: str = Cookie(None)):7 Y$ f- W; K, f- E& [4 p5 n% x
global topic_model_training_tasks + _7 N0 E5 t7 V+ s. Z 9 W1 q3 _4 x. X3 p& |# ~4 S if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ; u, ?; s; k; n! S7 ^4 d5 Y$ p raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 7 \* q/ ]) t% h9 r. w1 L ; q& [! p6 @4 r) @$ ` task = topic_model_training_tasks[user_uuid] y; @2 v" ~' s8 n0 s1 j8 O8 k
if task.text_preprocessing_progress.status_code == 2: # e7 e V. s9 T2 c4 O: \( m' Z7 A return task.nmf_training_progress2 a' f7 P" ?8 D) W
else:# W) j5 }4 k, P3 h$ }
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")0 n* w/ {' k" n7 J4 k
1 T O! q& O/ y( O- F: I, U6 D+ l7 g5 b8 Q! t+ E: K* J
@app.get(3 @ f; u3 y2 g% T
"/calculate/umap/progress/", 2 f7 t$ ]+ P, g$ g0 d B( | tags=["计算模块数据接口"], / x9 @2 Q/ D) m6 e response_model=UMAPProgress ) j% H9 [3 b. m9 ])2 x2 p, Y+ x% p; ^+ I
def get_umap_task_progress(user_uuid: str = Cookie(None)): 7 a0 _: x x# z$ q! a; R global topic_model_training_tasks4 n; E3 F7 n! |2 n! O, v) y2 y2 e! j0 ~
. n% l* h* h' a# V if (not user_uuid) or (user_uuid not in topic_model_training_tasks): ' T* R! j( P' _1 y$ k8 T. f raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ) Q* ?! Y' k% S9 t# F " B: u6 h0 n/ T3 h# o task = topic_model_training_tasks[user_uuid] , g, [5 p1 ^/ z9 F4 u if task.nmf_training_progress.status_code == 2:% N$ y4 L( h. n8 m% C; [5 c
return task.umap_progress 1 W/ ]7 J z1 j% T d6 F, r else: 5 W4 O) e2 {% C4 o raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 1 ?* k1 V t ^* U" n2 m* Y1 I9 d" W$ S; c- z
( _) y u: D9 @7 g# S@app.get( 3 v/ ^1 P [$ j1 d "/calculate/nmftraining/predict/progress/",* }( P' h5 D# T; ?* V5 N) e
tags=["计算模块数据接口"],9 h i8 L" _9 m2 {6 w: F; D
response_model=NewDocTopicDistributionPredictProgress 3 ~" [- a& \ R): r, {( r5 v6 o* e8 o& @4 K0 P
def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)): , g' U! m$ e( F/ _ global topic_model_training_tasks) I' O0 G$ O' f3 A& Y
, L8 p1 w# T! B& `8 n% [1 ]0 w if (not user_uuid) or (user_uuid not in topic_model_training_tasks):- |& O. o5 I* @
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")) K* e1 k/ u7 H! z0 I7 ^$ R1 r
; ]; k0 f' O$ a% `% c task = topic_model_training_tasks[user_uuid]$ e% H P* Y- @9 X' j; C
if task.nmf_training_progress.status_code == 2:) H" \' j* T4 @2 [: H) e7 N: U
return task.topic_distribution_predict_progress/ i$ I0 ~: G1 C6 Q2 S
else: . `3 H; E$ ^3 q0 M5 |+ H' P raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")8 [# x3 F. e3 k- U! l t/ W
7 p/ W7 h7 E B7 o' V
' p8 d. X& z1 a4 c5 c# p) C4 u
@app.get(6 Y$ [. {1 h% B; |" k$ O
"/calculate/details/document/", 9 }- w! b9 G3 U" }+ Y- c9 k+ a tags=["计算模块数据接口"],# R9 f. o& F) p
response_model=DocumentDetails : X2 Z! k4 B. ?) V# ^) $ X) J/ C X0 Z' l' [2 [- bdef get_document_details(doc_id: int, user_uuid: str = Cookie(None)): 0 n& F# @( k% c% s+ D+ [ A9 Y3 w( A global topic_model_training_tasks . T& ~, p2 g$ O, N6 J & o! q4 ]; I0 }3 w& m- g if (not user_uuid) or (user_uuid not in topic_model_training_tasks):( k3 T W4 c0 W
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")6 {& `/ N' K8 {6 c/ P' }
9 f% f- \& x8 C9 R0 j task = topic_model_training_tasks[user_uuid]3 i( V) | C$ m! @: o. P
if task.nmf_training_progress.status_code == 2:. A5 F! a, G2 t7 Q z
return task.get_document_details(doc_id) + B- `+ R# f8 X- G+ M; p+ D, A else:8 z5 `- [+ U" D6 V8 ?( o
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") & l9 m; ~& ]1 H" l! ]- n4 B7 \# o) K5 S+ d+ d4 z1 p/ ~& I
! k1 M6 ?2 u- V/ W \! l@app.get( $ w7 G t/ I# }! |+ j "/calculate/details/topic/", - b0 b3 V/ U# d6 X tags=["计算模块数据接口"],0 n5 D N& K: Z9 c0 O, I2 X! o9 I
response_model=TopicDetails 2 D& _: S6 W: `$ O% o8 e% \$ D m- l)& ]1 h% H3 Z0 r. p$ G
def get_topic_details(topic_id: int, user_uuid: str = Cookie(None)):8 t1 X. Q! z* y1 i$ V% ~5 V
global topic_model_training_tasks8 p6 C1 c% `' n9 @
) j) W' C: d9 V9 x* o if (not user_uuid) or (user_uuid not in topic_model_training_tasks):( ^! o) i3 V8 D( D2 W/ h
raise HTTPException(status_code=404, detail="未找到相应的训练对象!"), B+ E( b' |, |0 ^- \( {
0 D' l0 \# |' Z6 Q7 G: {) f, h9 [+ h task = topic_model_training_tasks[user_uuid], y y/ l3 N) \3 b. E' o M
if task.nmf_training_progress.status_code == 2:5 K& j B0 {; r: |" e$ }2 ?
return task.get_topic_details(topic_id)9 `# q* m( W9 z& w
else:# m( O. E% _# `. W! Y$ J9 x
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")! I, z& z, w( _' A) W2 d$ q
" o& S% b6 e: w" d9 p5 U3 b
' d( I- C: O5 Z& W" r% |
@app.get(1 d/ n- f9 H2 Z$ l
"/calculate/userinteraction/info/keyword/",$ |- V7 M: p0 W9 v& P2 S
tags=["计算模块数据接口"],* n0 ^. N; j% g' O# u$ t
response_model=TopicKeywordInfo $ Y' c$ t8 m T4 ^( D) 9 S' @" h7 r |0 b5 @4 `def get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)): ! v K9 o9 B( B5 X global topic_model_training_tasks0 @, F3 M/ O3 W' N6 a& Q5 D8 @$ ^
, d6 [6 I9 f3 i J
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):0 k/ e0 A' }! G; |% C
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ' I0 V9 p8 E5 E: x, ?) |, y* n& p& H: J( Z, E" [
task = topic_model_training_tasks[user_uuid] 7 L% i* c7 J I2 D7 ^0 K; i if task.nmf_training_progress.status_code == 2: 7 c3 a) N+ }- O return task.get_topic_keyword_info(topic_id) $ t$ P& Y0 R4 T else: 1 n! ?" l. x4 B" b) j raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ; V L# q2 c' t+ k* W( [% C0 V4 Z1 I N) }+ i* E ?6 a3 k% Y% |
+ n- ?/ z! e+ |+ \/ C. E0 I: ?
@app.get( `) b# v. T7 G* H9 ~! L% H
"/calculate/userinteraction/info/topicmergekeyword/", + |+ l1 b9 Q+ q7 W* u' R tags=["计算模块数据接口"], # ^/ M5 L* V* _& N5 n response_model=TopicMergeKeywordInfo; I: G; e" n3 l
) % A1 u9 v: o" |0 O6 m, v' Y Fdef get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)):& W4 O' K' x# c+ D
global topic_model_training_tasks' R; h: ]" w$ h' ~2 S
) T0 B. R/ c" H if (not user_uuid) or (user_uuid not in topic_model_training_tasks):7 t' g' `$ |& k a2 l ^
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")/ |$ h5 @8 C5 L9 c% f, c$ E
9 q, E* `- c. S9 K: A) |* A5 A
task = topic_model_training_tasks[user_uuid]) O7 N5 \; k- w' M& e5 b- S
if task.nmf_training_progress.status_code == 2: $ v' f+ i5 t; t* `7 T+ G return task.get_topic_merge_keyword_info(topic1_id, topic2_id)" A6 y; O- U7 L7 J
else: 3 a. \, Q" o! V raise HTTPException(status_code=404, detail="请先等待NMF训练结束!"): N [0 k& G; c( F, b7 p
7 T; K& y9 f. c# d! s3 c( c: f! \3 T. `. B
( H) _- T1 a& h) d' \. u2 N
1$ Y$ W6 R) c0 }5 X! Z1 ~: r( `1 y% p
2- g. s) j% y' o; F/ v. S
3 3 s! }1 I; W" B4% r6 _$ Y% Y" E$ u
5 : _. |$ F9 K6 E- P3 i4 u+ p) `6% `% G. X" ~; H7 w
73 y6 T, _/ t: \/ l
8" f' u7 w+ M/ p7 R1 y( ]
9' o& \# J5 v5 w& Z
10 7 k2 Y' [8 I/ f& C7 V9 j11" P/ I" l/ I) X+ l- g
12 . E4 D8 B5 q9 h% p* e: S13 ; b( f- S& I8 O$ ?" q4 a* N14# x) D' P i1 {& t5 @2 ^+ ]* M
152 W! u' v% x2 f8 `1 S7 S
16 / n: H5 ~: L1 @. m+ Y& d7 _9 Z17 0 b' R4 B% p+ ~$ |4 V+ S9 j" L8 v5 [18 - l0 t# v4 Q5 w, v19, F' @6 i! g/ {3 u! z9 G7 [2 ? L0 B
20/ \. y5 p7 x& F. Q4 R3 c7 b
21 6 l9 k. A! Y; I22 " r- t0 U! s3 E. y t0 Q23 ; q; Z& L. |: Y. A( ?6 Q2 M5 `24: j7 G3 p$ I4 |3 ~( }* P8 a
25+ \0 J' k, z% h! _+ y2 g! _
26 % w& c7 U0 L1 K8 D _, j27 / x3 R9 r& i+ I0 C28- q5 Y0 ^( M% r( n, q$ @" t z ~
29- K8 [# Z6 g; `1 B0 x- t5 w
30; |+ V+ g6 M; D9 U
31 ) G( ?! g) z4 G2 t( n32. D: T& f w9 ]2 Q) g1 s
33 9 A h, u8 N) d5 U6 Y+ W, ^2 C34 6 Z3 O/ u8 u" @, R: N Q; B35; _9 ?2 }8 \/ R( ?9 d1 m
36 & [* F# ^) [9 |1 G0 \. d+ S& h7 Z' q37( }: j' {2 K, j: I
38- y) T6 `; M* Z! a5 b
39 # Y, G+ y6 |9 j* {404 o, M; Z) y- y" V) Z
41 ( X0 f1 w5 P# q42 & |! J6 d) E* P432 r6 d* f9 [% e! ~2 g
44% Q$ E% L7 ?# _# I! ?
45 2 V, v, W; {* _' f5 l; ?7 N9 P6 L46 2 c4 ]; }2 a6 M' y: y0 y47/ } i4 i' P& r4 l- r4 m
48 2 r: o- W* ]; _( Y: U( h49- H8 @% w9 H+ _9 W. s p
50+ @; d0 C) z" n" m) l' ?7 @
51& n% f0 x4 }7 m4 S
522 C+ N" _/ ~: r8 t X8 I, a
535 p: \1 K( r% j$ S D7 r
547 \, |& q4 X- M @
55! @9 N0 Y1 p6 }; ]4 h
56 $ c) _! a* @( p. @0 l3 u( A57* y( l& I' [! T. Q9 A% k
58 ) P. p0 F5 H. y4 n* O59 & U) K" |- q/ s604 S9 P, |. x# a3 y
610 d. S: V. @. O2 H
62 " M6 l5 v& t- R& k6 i/ |63# t, ]8 J6 V% d' c- N
64 5 H3 ?4 i# ~# C, C( ^- j/ |/ y* w- B65 3 P* C2 Z: X! |0 b# n66 C9 ]# A4 C. \9 B' r- y7 O2 l \3 B
676 R+ ^$ s% ]7 }9 G" i* u6 q. b
68 1 u: g. g! p. w) J( i692 w( {, z5 W2 p0 S1 S) d
70 , Z( ~2 K) H# h71* L v8 t. q: V4 R& H ~- O
72- L3 K" b. B ~# n1 H
73 ' b5 `) V( Y. b- }74) g& w+ f* d2 s9 C1 e, p
75 9 ]: B6 P2 R+ _' L76( }& ?+ u0 q) e) j; v+ R& P
77 6 M2 C, P2 Z; l' C5 W% a9 i78; q4 m9 N9 k, K3 D* w$ n
79 2 L% ~- c. K3 \% g2 }$ X80) u0 \5 D! X& O+ i. g3 [
81! L' x: d1 O$ ^ j/ Y) f X: z
827 r( d0 E8 C& V+ h
83 : i: f. o. C: H; ]# c! j84 8 N2 m$ I& s. y) ?, t" O. X85 6 s' |/ A* `+ v5 L4 f86 3 y6 S" p9 U3 s6 q" B87 ! b1 L8 ?6 ^" I9 k! I* g1 n, s88+ N. j% m: G: `8 Z
89 7 y' m4 I/ P( A& N90 0 J/ }$ v. @# a" E# K: a' a: y6 y91 s+ w- h& ]2 t6 E \ S- ?/ ^
92 1 H+ t \- {/ M/ |. M: f# w2 R6 g93: w5 q, C; Y' R7 b, A% j
949 w- o( ~7 A, w
95% @5 D$ a6 [# p3 U% L8 d
96 - ]" ?: f. t( n0 J& u8 k" v2 B+ s975 N E8 X/ m4 V7 c$ I1 w9 `
98# F7 m* R' `5 Y: h7 L2 X8 S$ `
99 ; n3 V0 ?$ k7 z* G' {- L6 R+ \100 0 K9 w; P" I. \0 x) e8 H0 k1015 }3 c# [! Y: ~2 B3 p9 P/ e
102 + ^7 C) w' `# F0 I& I- I103/ L+ w. ^( C# t7 C- H! B9 L2 _& O8 t; j
1049 e" `+ r0 C8 q. u D0 u
105 + G' q% _# N7 R$ t& p- ?' l: F106 - ]& r7 b& v5 X" h- {( N ?; ]107 " Y3 Q$ h" s; ~% |108- j/ Z6 G! T9 C1 v, U+ V: {" M$ E
109- ]+ ~8 p# s# H) q/ G. O) i/ i' X4 F
1101 _. ^; A5 j5 p) `6 i2 y6 a, H
1114 P& G. I" M7 ^, @' W
112 " D# m% |' L @113 # [) E. y" m! a# I* \$ U114 t1 P% F3 x$ a. i9 a8 W
1155 w4 n5 O+ i% g
116 . L0 }$ i* k- S W) V2 G4 m- ^8 k117 ; u# z- g" V2 G# h5 B- X118: }& I# [; m n- r; J
119) a4 i9 Q, t! l& Z2 s' L
120 % o2 s' j. u3 c4 U9 ^* {- J121+ m( E& A3 e, n3 R u5 X
122. a7 h, Z% U, W' T0 X# f/ @" k
1232 l5 q1 X! ]7 [# ~
124( I, g- x" w& I( _. u
125 - l, t1 j3 z& ~1269 d2 b v" S/ `4 I
127 4 G1 t; ]" i$ k' P0 I) F1280 t2 Y# W/ f1 n9 x0 l2 j% B( V2 j
129 , l. ]6 B8 j5 L7 p1 i9 o/ E2 n130, p u2 N9 o% H; W
131 , Y% }0 d5 h& d) G132. Q/ a; B p+ d; N
133) O( E# [( B& p! j' S
1345 j9 M& L3 ~* ?% D. U4 R
135 ! g$ o% k9 I- i9 J0 K y136 7 u4 s- A# q- D& a( t1373 v5 N7 R4 S4 G# X3 J# F
138% U: ^+ H y" \& _! D, F# L
139 5 I6 {& F J4 S K140 5 M Z1 \- K" z141. e, p) a; X6 h; c/ Z3 H& p
142 + E9 Z; C" y! ~5 |# L5 ^143 ) F! r p# H' L' R8 _144" x" b" h' ?, W6 ?! W% ?
1455 A+ y7 o4 Q/ U* Z! [' V& E0 F
146 2 e# E+ K' h/ [* @; x1473 q7 L6 A% d* X; T# k4 F( e2 U
148% c) ?4 J4 ]# `
149 & d p1 J8 \% ]# h: G( L+ |% H150 - [1 \$ |, w! a& _0 Y0 L' H151 7 E+ @* W1 ]' ~4 ` d5 V! [5 v152 & n3 {/ I" S, @( I$ k153 * D' [ L1 ?" Y, k! L. g154 + ] a) Z9 R$ A( A155) Z3 A2 E& o S2 w) f
156! u6 l" w0 v% y; ~8 ?
157 8 Z6 l( D! e# g, j* q2 i( T3 }158: Q: ]5 [+ d2 Z6 v; T% K* N9 ]( y
159 : O% }* U) e g* T1 [2 h' @1606 j; X' y0 J, f" b
161 . {" K$ z$ @. x' O5 U, s162- `2 l- I( u; U& y9 A- J
163( _, e: x/ M# k% g, a7 X2 a- _4 E; ^
164& S+ t, ^% T1 _" k$ o
165 0 y) S& E7 X- N$ U8 W0 z* `1667 l- s2 M4 C6 z0 K0 }% I! z9 ?4 q3 J
167 . G) M4 C0 q+ C% G168 ) M, f, _ a+ C5 N169 - L, L) {, Z+ j8 p# N( M \1706 ~& S+ j, H0 o
171 4 g8 R. s+ f" y. l4 ]$ P172+ i6 h: y9 o% N0 C; y7 L! l' O
173 % V$ X5 w$ H. |9 [; j; h) o! i! q174. Q5 f6 S1 v- d6 u' D, N$ E9 }
175% C5 \1 c, O+ Y' u+ x
176 6 i" \% c4 u% j5 ^177$ e9 J" F* C/ i+ ]1 i% d- S8 _
178 o) S' L% U: C2 x- U( g
179& L3 z$ c7 b7 d( B- t# T% H$ s9 S* a
180 " V& P! ~8 L% r181* m: y1 o q/ y9 @$ N* F) I
182$ m6 i( F# \# l) i& L. V% h
183 6 @8 [- ]- F3 w9 ]184 3 W; u0 W& s* e( \1853 V+ |+ X) O F2 c
186 - T x( Z) B4 Y7 ]+ ?1 p% @187 & v& T7 V2 S2 C. ^0 \1889 F+ ~5 t8 Q, B
1897 H/ P5 w, `5 e% C7 Q2 t
190/ u$ z6 y7 x! R, M# j% i
191 4 ?: G/ j8 ]& ~/ n; U* z192 3 _# O5 e. q, v5 b U+ R193 ) e" Q) ]$ @: [' ?. f# D194 R+ X( f1 K# Z3 ?5 u' a195 ) l1 P5 g1 |/ r% ~6 Y196 ; }$ R* u4 c$ a& Q$ [, S197 ( B( G* e0 h. ^+ W3 U2 L$ i9 g O1986 z. U1 d# ~) b; D
199" x/ c, }* ?' p1 P8 o: U2 q: O, [5 K) R
200$ e- o( [7 z9 S
201 8 W/ A5 |- Z2 I8 @202: Y8 q$ C* f7 e7 o
203, a% W, Z5 E" A7 C; `
204 4 M" v( s' C# c( x% T0 e205 1 o5 h$ X* w; n# m9 X3 S8 V3 V3 \206 4 j0 u8 B0 |4 d0 }5 Z2 m' F2077 Q1 p% d% Z Q! P- g% x! X
208 2 J; o \3 F) g2090 @* J% C8 m- d+ n& p4 I
210 0 B+ R* i: F# w. ?& f& F4 H211 0 @2 X2 Y2 T) R; Z212 2 d# Z* u: d' o8 x8 r; T2134 V0 ~0 ~6 @$ l$ d; g7 _0 C
214$ F2 @+ `; N8 w- }
2151 @8 o) Z# x/ m0 L+ I
2168 [! N; p, r% @- w) x/ d0 K* i0 ~, R
2171 h# B' o% u9 y& w9 k9 c {& H
218 c) i8 A& }+ h5 B) }
219 9 J |, X. Q) ?220 ; L$ L" E, H$ L& {" G2 l3 M0 {2216 d1 B% \) c+ }3 A8 y
222& L" m6 L5 Y# M( l: @9 t- q
223 ' E* J i% x$ D3 E3 U$ `224 - P7 K& {/ P) w( @# U2255 l- M2 n3 |$ t1 C
2263 p/ s u; Q% u
227 . [# I, z& p4 l5 s( n( ]1 C# @' u) b228# x3 L( x) L, V5 N- S. ?# A4 G+ z
229) x! @7 l2 e: |* J/ Q( G: I
230 # \7 z* K: \5 P# ]231 ) G% k! s3 H M+ }( I6 V. w232 ; A) }, n$ L+ \( k* ~233 , T8 M+ m o& ~% N234& Y/ Y' L6 J b, P" `/ ^1 D: H
235 / J% C# S7 Y5 {9 @) X) P Y3 l2 i# J236 ; e9 n& B5 h) R% ~0 Q237 5 |! `; v. B, m& y4 ^6 Y# G238 3 U1 B- Q( X2 F5 B+ L- d0 y239 6 h5 \1 s9 v$ P4 n% }. G' y J: z240+ Z& c& ^$ \# t, z" W! |) `# ]
2417 L E, K @0 C' g5 C7 H( k
242 ! G3 r6 r: G9 g: G0 v; w8 i* K) M5 o243 - w, e) R/ q4 |" {4 B ~; a244 7 k; J4 {6 H0 r) l1 ~; Z" x- b245 " d$ l3 o Z$ [# D- w4 _$ Q246 6 K, @; c0 D- m9 `" E/ B247$ U! J8 c" _$ t7 G; C
248 : R$ `2 \) e" M$ N# `# B1 k249 . _- E% E) p. c/ m7 ]8 G+ Q+ d8 s250 & u& L _. [# B' _251 & j }1 U% h2 {1 @/ [252 $ h/ ?. ] i9 t2530 `8 N- H b @4 D I3 ~
254 1 _" w( L& p+ |1 e7 ~6 L" S255 8 G/ y; u: a5 b8 t4 n% T256 6 d6 W- d! u4 W4 k/ y! s$ O7 B257 3 W: n7 N' i7 ]: x$ g& G! z2587 V( `: T/ C/ ]: x; m" p
259 2 V5 f0 b! w5 e8 I( R3 {260 ; z/ e: c4 m. \. Y( h2614 W* d9 @) D2 {7 j6 ]! E
262. a$ n! l& } F0 {; C- O
263 1 M0 U' v' a7 G; w2647 A4 M y; D1 r6 t, F# u5 [- n
2656 {) c5 ^( |- I. J: S
266; c7 T/ A0 E/ r8 |/ q: S% u
267 $ Y2 _# P& b9 c; ]' F268/ O% ]9 F5 x' U/ d# }' J: N9 r
2696 F* E! S# a6 V/ {+ Q9 x8 p0 j
2706 s; k$ O" b! G& _
2713 R* d- H/ |" {2 H% T. `
2727 U9 I2 Z& U% l7 a g
273* R6 f1 a# H$ U5 V) G8 _
274 1 F5 P9 ~2 {+ i$ n1 ~275 ( X& |7 Z7 P* S& t1 v9 u276 , X* J+ _/ J0 b' P: K4 t% u277 8 i, T& K l4 {278& _3 R3 q$ B. V/ A
2795 ?6 ?" `' w6 h; b( T% c* d. c
280 & v# A! X N8 p1 \281 3 I7 k/ X, c/ A g6 K" L3 C& F+ c4 M4 a282 3 N+ X6 J; e" }" w0 }283+ }: Z& P, S2 Y5 B6 G1 k4 f
284 ' Q; p3 Q- m! L8 A285( t6 B x& W9 ]5 ?) f2 p$ G& ?
2860 b" o/ k8 R$ }: r- p: e
287 $ i) K E, S# a$ z" W5 k4 m288/ O% \! U: |. _( _
289, [- q. }' c3 I1 S S0 @
290 & U4 C+ d# J, H% d1 z& U2918 S* F. K- t, h1 H2 D
292 5 `* U$ j2 N& s3 W293 K+ y/ H, \5 _294' i9 O& w5 c! O8 d, n
295 ) l2 d& v! L3 k296 ) j5 E/ m1 L5 _6 r1 [297 - | d& X) Q/ @2 g$ ?! Z: U2982 D) C1 B" _ ^1 p; `
299 $ b6 P' H- W$ a3 D300/ Y' ^3 Z0 g9 R- f/ u
301, S: s# U9 r4 W2 `+ |
302 8 B- x# C$ A: O% _- G303" W6 c: N5 }; W% i, C
304+ ^# M2 u! ^2 k9 U2 e
305! I2 F$ l1 i4 b& g* c$ n! P
3066 C; U- h. b9 p
3070 C+ S P4 Q; w8 M$ Z; j& E1 _ Y
308$ t8 P- d2 k/ S/ v: v9 Q
309 % i2 V) U: @& O) P310 l! j7 A) ]) K( c9 ~5 S
311- f4 ]1 Y4 R( Y- @* x0 U5 j0 s/ J" ?
3126 ^( U1 |8 o1 N* t3 i
313 & @6 q6 K& K: I4 R314 8 u) f# ?* P9 S7 T0 A/ {' |. Y315 , Z4 U/ ~, t7 N$ n4 u: h3166 {9 ?) v* F Q7 y( Y
317 : u& u; l( t4 |& H6 u. y8 _318) A( U6 u; [+ M/ S+ U& G; a
319% g: D: q. y' V' S# b
320 0 P; |' E0 L% z/ Y1 U. R# O321 6 R0 {( z9 G' K* p6 z y322 & B; H0 `0 o8 \% _323 - B+ Z# k$ b- K; W, D2 O) N2 @0 E' ~324/ z: a, k1 Z" z' s9 s$ w
3256 f+ n, Y* j3 z# `) f+ I
326/ \ F& z/ e+ r( M# P \7 b B$ Y- k
327' K$ f8 {+ c9 i( _
328 7 f0 h# B: Q) @( x; \# o' @2 i! ~3296 F) W8 h0 Q+ z* f. b
3306 L/ x3 b. r, w0 x& T( M& H
331/ O1 O3 b0 V+ j2 |& Q; U4 p
332 ' D7 }7 A; F8 a. x& G& J2 y2 a9 d333$ E0 G9 c4 s: m. } {
334 : g9 ^# @. G, ]- W3356 U" p; q2 c$ `& [
336 2 M5 J' b- \+ R( U# W! {& g' o337 ' ?. E. E2 H# m: Y! P( Q: d338 9 M1 z1 Y- I5 O2 Y% X) x; A6 Z339+ p% ?+ \2 J6 Z7 a, ?6 x
340( y; G$ G! u9 J/ n/ X, E5 ?
341 ) E: l2 n, u! O: ]5 S; Z$ X- t2 R5 o342 3 K, ?5 ?* V& M1 j5 o, s M5 w343% Q6 |; c- g( D% Y' O5 @" Z1 N- R4 u
3448 G6 [4 @/ j& \% |% H
345& t( k9 d9 S) h0 W. o# h
346( z1 ~, L# o2 q, Q! u: U9 M; z
347 & @: b6 h) w9 K: I( E( q+ z# u E; v348 2 h1 U2 Q, S! P* o3 \349 1 f# ^8 k0 g+ w" X350/ l- f. X W) K+ ^
351' W2 \- F* T+ n; N( T. U
3529 Z0 }5 X) \( ^0 m$ x# d. K: h
353 $ O0 j# U6 F5 X6 r& k. y& n6 u: ~354 / w' t* y& S1 m+ ~" @7 j$ s355+ o$ S/ K! i/ p* e! x
356 7 _8 L; n ]: z5 u357 2 H# I; G8 y% b9 l8 D5 i* G358 8 w1 q' J3 ^1 A' L! [' ~359+ H# @4 Q( Q2 L! l, h
360' i% Q6 o! f( G/ }2 Q0 n1 L' n d
361, d7 I1 D! W/ P1 s' I. k; I% \
362 " [/ C% \% ]% m8 @363 6 P2 T Y, w& X2 ?) x364 ( F8 k b8 J8 J/ T/ s% k9 W365 ) t/ }/ Q) k- Z* F% H$ H6 _366 ) \0 ^# \! n; u2 c; `367( o4 D+ C& u7 f3 J8 o! g. Y; P
368/ n1 ~ ] H ?+ d2 k- x7 l! x
369 ! a& g8 L \9 |4 j3702 X1 |, q( i, C% e" e" g: m
371 # x* {+ k0 q" t372$ t2 D( {3 W8 w6 ^4 O1 f' M
373 ) v( f" w6 B( F( e7 x+ E! U3748 o' m, K4 _4 Q7 `" I3 I
375 $ B& P) p" M) d4 k0 ~7 `376; u4 d" o0 ?& ?6 ]
3777 A, W: b6 }, T: L: d
378 + p: O# @0 ~1 C. M8 ]379 " ` [, B* D3 s5 l& I9 ]3801 [2 M Z, p! d8 D( n& ]7 P
381- p0 O, D% D% y* F
3828 U4 M5 h% O( ^: O4 o$ _% E
383 1 W! R2 o0 H4 r, w8 e$ ]384 ) W% I, f8 v6 j' q6 |0 a: r4 g, `385 ; C" v4 E7 i( o- }& `2 b3865 ]4 I& Z u! k7 r
3876 F# _/ E1 ^0 U# x; ^
388/ W* E" m4 z, b
389) P, P) P3 O. B8 K4 N3 C, Q
390# |; f% o5 S1 B; I* l1 A
391' l5 G1 f; @+ e+ t5 B7 h
392& P: E9 f1 |" U( N: V5 W
393% z$ j( a1 @5 k$ M- i' m/ Z
394* \+ w" f- m3 e3 _/ |
395 : e' [* A8 R/ l% o3 J396 8 a+ [" U6 F( A/ ~* T. t& Z397# ]3 b, R/ D8 k, J
3981 J! Y8 R" H6 c- C: W& C& q
399 ) Y2 j7 ]1 F. z) X400: `% r, ^/ b5 o5 i3 }$ h h2 k
401* D9 w, v( D0 g( v" f) x1 y
402 1 ^/ g( [5 g- u4035 ~6 q# A2 y: V% A! O3 B9 U; {4 V
404 ) G0 k, I F+ s3 y8 E3 {$ d: e405 : w# ?; u& @8 i" F# l4 w406$ l; }1 [1 x5 f
407 8 ~7 C, }; C4 p! r5 i3 ~. n4084 |2 s; K9 X7 U: \& O% S
4095 Q1 L* R' w- E2 z6 S
410 2 q* h- P1 C. ~5 ^411 / h, w4 y3 }' a# y7 P412 5 u" d- |, n/ N& `413 2 f4 j/ b0 C9 J3 Q$ c1 u414 ( \8 F* c6 D) A, I1 r- S415: `7 c/ u- d, t6 |$ \& ]
416 / |: q4 Q- F6 M9 X4175 k; @# E& @9 S3 K2 X* M1 X7 w9 g, F
4181 T- _/ W, ~; f. ~6 _# Z
419 - r3 J/ \% F, E2 o% V* E4207 ^* r# @0 I1 D5 u8 g4 J
4210 D5 n: w# k- F6 y; n+ \
422 8 G5 K/ q; K& n3 {2 k& \423 & i& H" s% ^" }+ p. ?- F4246 A/ u! N- B. Y2 g
425. }& t2 t7 s+ n; g9 K) ^. t$ J3 s7 X
426 # ?! O! Z. n/ H427/ B4 b$ J. Z. r4 x- r8 e# m
428+ b8 L( m7 Q) a+ ?& ~0 h, O7 f3 F/ n; T0 Y
429$ l+ p L4 \* B. B5 q
430$ z# c- Z" {5 r) \0 Y. q8 H
431/ M" ^* p9 A% x" q7 @& m4 t
432* w8 ^/ j" V& c! y) s1 }
433, f: V' Q. e: \( g+ n' p7 S
434 4 l7 X; }# j0 s: N435 1 y5 n- E' G: V# n7 }9 n436 5 w4 ?7 M! U2 v5 Z) S/ z# g437. S, w) t2 x( Y9 B- q- ^
438 6 G2 y! g; E) `1 e0 I439 9 [/ a: v! o" i( S& R440 9 ]! ], L/ _; V. {9 A. E441! \2 W0 H( T6 Q2 N5 R( O
442 2 Z& K" A* q% J; z* H7 c- }$ n/ ]4433 v. f: Z/ `6 c5 J5 k% ]
4443 N" S( L. a3 [) t
445 * @! O% c6 J2 o* d4 {446 + b2 E+ G7 F9 P, c& Q447 ' Q# T! w4 u6 i448 ! m" U9 A b) g( Q3 S4 q- n449 3 M4 ~- r# k4 Z450 # }2 }& ?% |; x- h: f% T451+ Y# B* x' Y; M R! W
452 / Z5 Q# n% |# W; _; G1 y. f$ {453$ c5 j& z9 r/ x$ K2 }1 v
454 ' _/ ?- l, G( ?* Y2 D* ?6 W455# }! X8 y# z4 [" h' j0 b4 K4 @
456 g: `1 L* e) t$ ^7 I+ f' c. c457 ( [1 A* M' d, y6 r9 T+ ]458 + G4 k8 F" k. `459! ^: v3 G! S% _/ y
460 8 R+ e1 r/ d) Y5 G! c461" o1 R! M* w+ a1 p. j
462 6 M5 O! `( D' U& {463 ; z' c% v2 ]( D" B464 & d0 ]. F0 r( `/ d0 o: {7 W. |465 4 Q. T9 ] k" q! p/ A4667 i) I3 s8 H: x" g( f- @1 [
467 , a0 a+ H( o+ @9 a" h' r468& ?( ?# C; d' e6 y$ \+ @+ Q! G
4695 N( O4 d6 C# N% j& {
470 8 Z3 J: {; n# B; ]: k0 T- f471) T( ~$ v) Z5 y
472+ A% f' X9 D. B: p: N" o: ?
4730 m2 q% p2 r5 Q/ S/ F
474) ?9 Y/ ]$ v, H& Q) q9 t7 P
475 5 Y# X* z7 @3 p6 y( r1 y476 # D4 D0 Y+ w$ k: j* z& b' y$ r& y7 |9 A ]
7 \/ A# h1 S) y$ _6 s7 m
# W) ]9 s& v/ b2 [0 S( o- ^9 ~; d q, t; L9 j8 L0 E
, e* f( v. I) \
4 H* B+ J% j6 ]5 K0 G 4 c; u" t, ~3 G - h+ U, x% H, g* e ]" Q / P* \: t: V D # Z9 b9 g) a7 o. z! w) } % k& |8 f. ?* J" F- V. x2 E( K& E# l6 G; F% e
4 s# W: _" l6 f- u
/ u0 V5 Z! D4 t5 Y5 {: z : }, J5 E% r* L4 n' ]8 ] / ?. L' L6 Q, g+ S$ A ; w+ F* [% B& E- U$ W5 L2 n z, R# z