|
什么是传染病动力学?numpy和matplotlib用python实现传染病模型SI模型SIS模型SIR模型SEIR模型 什么是传染病动力学?最近,在报道疫情的众多新闻中,相信大家也看到过一些来预测新型冠状病毒会导致感染肺炎的人数。你一定好奇,这个人数要怎么预测呢?预测人数又有什么用呢? 事实上,从学科方向来说,这类研究属于传染病动力学,就是用数学模型去描述传染病在人群中传播的规律,从而预测患病人数,进而指导政府制定措施和政策去控制传染病的传播。" j' t0 ^* O1 y
这类研究最早可追溯到18世纪Daniel Bernoulli对天花的研究,而我们今天所要介绍的SIR模型是1927年Kermack与McKendrick在为了研究伦敦黑死病而提出的,是传染病动力学中最基础的模型。 介绍了传染病模型的背景信息,不知道现在你对传染病模型更有兴趣,还是执着地对python更有兴趣呢?不论哪种,这篇文章会满足你所有的好奇心。 numpy和matplotlib首先,安装一下这节课我们需要使用的两个python包,numpy和matplotlib。
; A2 n+ T7 C( u6 m6 Unumpy-是python进行科学和矩阵运算最常用的包。 用numpy建立一维数组,存储和计算每天传染病人数的数据。
* f+ H. a3 Q: w/ e" a& \import numpy as np import matplotlib.pyplot as plt 用matplotlib绘制传染病人数随天数变化的曲线,给出模型预测人数变化的直观认识。 好啦,下面开始用python实现传染病模型吧。 用python实现传染病模型为了让大家能够更好地理解,我们先不直接说SIR模型,我们从最简单的开始。 SI模型首先想象这样一个场景,一个城市有 个人,假设没有人出生和死亡,忽然有一天有 个人感染了病毒成为了患者,如果每天每个患者能够有效传染 个人,那么第二天患病人数是多少呢?最简单的答案是: ,也就是说每天都会新增 个患者。那这样以来,在无限远的将来会有无穷多的人被感染,显然这是不合理的,那错在哪里?仔细思考,你一定发现了,已经患病的人就不能再被传染了,所以我们有必要把人群分为两类,易感者(S-susceptiable)和感染者(I-infective)(你猜的没错,这就是SIR中S和I的含义,R的含义之后介绍再讲)。为了之后方便计算我们记易感者和感染者在人群中的比例为 ,那么 。我们重新考虑上面的问题,顺便来个示意图: Image Name这样的话,每天新增的患者数为 ,也就是总传染人数乘以易感者所占的人群比例。8 R$ G( M2 v. [
那么每天的感染者比例的增加量就是 。我们假设城市有一千万(N=10的7次方)人,每个患者每天接触感染每天0.8人(lamda=0.8),初始感染人数为45人(i0 = 45/N),我们来模拟70天(T=70)的情况。 # population
' M" N" ^' W1 F! z3 o; BN = 1e7- V, Y7 l# o* r
# simuation Time / Day3 ~5 f" Z% m- {3 ^- L8 k. J
T = 70
i4 A- F) k, |# ^, {/ [# susceptiable ratio0 }# m4 t. ?& M) x: }; x% ~2 K& E+ \
s = np.zeros([T])
9 T- S2 A ~; \- P. z* W% O# infective ratio. k0 X$ A( e% j
i = np.zeros([T])8 o3 w1 q& a3 q8 G
# contact rate% l) @7 q3 i( r. ^9 `$ G
lamda = 0.89 @1 L+ N5 A* j9 D( ]
- U# Y& P, i; S9 e* Z( Y9 w: Y u
# initial infective people
' s+ t8 @8 Y! c. [3 c* s" ci[0] = 45.0 / N! O' i& }5 b# X9 P6 i5 g. q( |
) z4 E/ ?4 X5 q% p$ n2 D" S
for t in range(T-1):: v; r Y7 T' x4 x" P8 u! o
i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t])
# B, j) e# f* N3 Y% K# c8 [4 v9 w; ^, [* H
# ~' C0 e% {& ~9 ^: j5 L& V0 I$ o1 v0 O
相信其他语句大家都明白,新知识是这两行:
6 r- F7 D4 @/ l0 l3 g0 I7 r+ @: \( P/ C6 ]5 I( h
9 s2 r2 k" W# u" \
s = np.zeros([T])
# t$ G" p( _+ `0 {5 p: `$ `i = np.zeros([T])
+ }: F" K* p* {* E' {/ }) [: o* a9 J5 W: g$ ^ h
这两句话的意思是一样的,就是利用numpy(已被我们重新命名为np)的函数(zeros())来建立一个所有元素都是零的数组,而给的参数决定了这个数组的维度。比如: ]8 o1 A0 W5 D( m. {& o9 }7 }1 v
/ g# p: b I0 s% B* Ma = np.zeros([2,3])
: N% R# O% v# ]a, \: L2 |( n6 }( q+ I
/ I Z- e( f% l1 Q
array([[0., 0., 0.],
3 r, x! R$ b7 Z7 e, { [0., 0., 0.]]): {, ^" |! ^3 `+ v5 Z
! V8 T ^" s) j& y) V" R& Y$ R u7 Y3 i5 g7 F
array([0., 0., 0., 0., 0.]): U# y. w& } f- @5 b9 _6 |
% D* H: m0 S6 Y
" ]9 ^( R1 E) L) t类似的还有产生元素全部是1的数组的函数np.ones():& {: x% A6 |/ F& {( @3 X6 X& e
! X v# e% L0 Ua = np.ones([5])
# D# D' A$ u+ Y; ^4 Ta
1 Q6 h) |) q1 m! |$ ]; v- l
4 C* q/ B9 i( @* l. X8 {9 Q1 T4 Karray([1., 1., 1., 1., 1.])
0 L+ s' E4 O/ u8 h$ i) Y1 \: }# l1 I2 q4 t, |# u
+ R. ^0 Y/ a8 O% ca = np.ones([2,3])& f/ t; H; w- a* A
a) N" t- f6 f- [ j! P H0 Y
; [- c, \1 K& K5 U j. a
7 d3 t* ?% ?% V! F, `3 L
array([[1., 1., 1.],
8 |3 X8 b" k$ q0 @4 U0 K [1., 1., 1.]])
- ^9 s, d3 `: m( y
; ~- |2 \+ W" E( k4 l1 L2 B7 G# k9 }! S4 z
plt.plot(i)
# R* w& r0 `; D7 x- r4 i6 Z0 a2 {% X0 p/ c, z% T
, E j7 \& f: {# I
[<matplotlib.lines.Line2D at 0x7f0c2768d6d8>]1 m, m* {) s9 E
8 ]/ ], c0 o8 [2 P2 d: c x
3 x c- j4 |, d- N" h7 w/ Z5 }![]()
5 b+ I Z( x$ G, k
% g# U1 X7 T+ E* w
2 g5 g% a p- Z- R0 s# r实现SI模型的核心代码是第三个cell的第11,12行:
# I3 v5 Q4 Z, k- W3 c# g' `) o' I3 c. q! c8 R% s
for t in range(T-1): Q: J- y1 X: C& z
i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t])
1 |4 x6 c* E8 y# c9 B5 I( N6 o4 w d& I
就是我们建立的数学模型,利用python的for循环语句累加迭代的方式把每天的增加量叠加到感染者比例上。 运行代码完成计算,我们利用matplotlib的pyplot来画出感染者的随天数的变化曲线:
* p9 u. Z& H& Q! A/ L1 e2 X3 C2 dfig, ax = plt.subplots(figsize=(8,4))
i2 q+ F& t9 |/ m' n/ I0 cax.plot(i, c='r', lw=2)' g- v" l/ j# k1 \8 E
ax.set_xlabel('Day',fontsize=20)
8 o6 R) m5 p5 S1 dax.set_ylabel('Infective Ratio', fontsize=20)
7 R S+ ~ @7 Kax.grid(1)
4 x) D! u3 m4 D$ y" Kplt.xticks(fontsize=20)
$ c# I. x0 ? K# M1 G1 E/ W& }plt.yticks(fontsize=20);
) i- w5 V" i3 A3 {% X3 C* l+ ]* P: K0 \ Y) i' [
9 m0 u9 W1 a: z
/ B6 M2 v& b3 N# f
% l5 i; L7 G7 k' x. n从这个结果看到,大约在25天左右,全部人群都会变成感染者,感染率 。
4 D' U7 Y2 E2 R. O7 L5 ~& E. @0 b4 D在程序中我们假设每天每个患者传染0.8个人,你可以改变lamda的值,观察全部人群感染的天数的变化。# g9 R- L: c7 O) u7 d% h) @
认真思考你会知道,lamda的现实意义就是该城市的卫生水平,衡量的是消毒,隔离这些措施执行得怎么样。回到传染病模型,按照SI模型计算的结果,我们全人类都会患病,这好可怕!原因是我们忽略了一个很重要的因素,那就是我们有奋斗在一线的医护人员,我们会被治愈!所以SI模型只适合研究具有高传染风险又不能被治愈的病(比如HIV)。 但是对于其他病,我们是可以靠医疗和自身免疫系统康复的,那么紧接着的一个问题就是,被治愈后还会再被传染上嘛?根据这个问题的回答不同,我们有了两个不同的模型,SIR 和 SIS。现在可以揭晓,SIR的R的含义了,就是移出者(Removed),现实含义就是指被治愈后不会再被感染的人。而SIS表示治愈后仍然还是易感者。下面我们用python来分别实现这两个模型。 SIS模型为了实现这个模型,我们需要引入新的一个参数,治愈率 。好啦,先上我们的新示意图: Image Name和SI模型做比较,区别就是计算感染者的增加数时要减去被治愈的人数。7 y) e0 _! M# C7 \' f$ @. [0 u
所以这时候每天的增加的感染者为: ,
& T3 l: \1 F' B增加的感染率为: 。
+ Y0 a0 f' _' k模型完成啦,修改python代码:
6 L9 V' H% [2 [2 N8 D! s r# susceptiable ratio
- @3 ~' _2 S: P+ r; {7 ^, n! Ys = np.zeros([T])# ]7 ^2 B1 x$ ~/ N" P) n* B3 i, H% D1 `
# infective ratio$ q8 D- `9 W3 M6 @
i = np.zeros([T])* @+ p5 F9 M% p3 r" Y$ |
/ F* j) W" V% C# q# C
# contact rate: C, s8 \4 l7 M! a8 V- w
lamda = 1.0
2 O; D4 u. N4 F3 F$ E' X# recover rate- z, q' y4 E3 V/ x7 ?
gamma = 0.5
0 U, z/ X$ X/ ?: C0 ~7 x! Y2 M% X, [+ h: J' z
# initial infective people
" X; _" e7 o' B6 P2 p# Wi[0] = 45.0 / N `! e O. Q$ Q' H; c6 G" N7 @
8 f' R9 n0 c' c4 H& ^# b* q; S4 f" Zfor t in range(T-1):
* s7 x; ]) e" x2 W6 @ i[t + 1] = i[t] + i[t] * lamda * (1.0 - i[t]) - gamma*i[t], K7 K Y' r7 m2 b9 X2 K
, U6 S$ j; H1 G+ O. X, Q9 ~# I1 i
' p- l5 L6 _: r6 @3 U% `
运行代码,我们画出曲线(代码和SI模型的画图完全一样):
* i" N! x& P2 t. T3 C
) i: P: z4 a5 m p0 I# Dfig, ax = plt.subplots(figsize=(8,4))
$ a: C0 Z% D# qax.plot(i, c='r', lw=2)7 ?: D. t8 T% r8 o1 G
ax.set_xlabel('Day',fontsize=20)
/ v- v( Q# u- N1 i) l* q! aax.set_ylabel('Infective Ratio', fontsize=20)8 d* P9 r7 w& ~
ax.grid(1)) Q7 \- [( g( c t
plt.xticks(fontsize=20)
$ R' h0 x7 b% bplt.yticks(fontsize=20);9 J! D* K* x! e1 `9 T/ }( \
- j! v5 S, F' m1 y4 t5 W& P/ w- w( B
8 ?) h- U# N: W9 O- b
* N: C6 l- Y( t0 J: x, U
6 e5 p; R2 k2 F; s5 b. F. B
行代码,我们画出曲线(代码和SI模型的画图完全一样)
+ f2 o& {' o- `" c可以看到,达到最大感染率的时间退后10天左右,最后感染和治愈达到动态平衡,人群中有始终有一半的人感染着。所以,SIS模型适合研究具有传染性和反复性的流行病,比如常见流感。同样的,感兴趣的话,改变lamda和gamma的值,观察曲线的变化。和lamda不同的是,gamma的现实意义就是对这种疾病的治疗水平。 SIR模型加入了移出者,被治愈的病人不会再被传染,先上我们的新示意图: Image NameSIR 模型' r) d" Q! ?, [! |/ u
注意到这里,人群被分成了三类,不再只有I和S,所以相比于之前的模型,我们需要找到新的约束关系。现在我们需要分别计算三种人每天的增加量了: $ b3 P& `, N$ I( o
- 易感者:每天都在被传染,所以一直在减少,减少量为被传染的人数:
- 感染者:增加了被感染的人,减少了治愈的人:
- 移出者:增加了治愈的人: 5 b* N) F6 n/ @; \( p
建模完成,修改python代码,并且假设人群普遍易感,新型疾病,初始没有移出者。 - a7 m: f* q6 G# J. k6 F
# population
0 M& h: x* W4 tN = 1e7 + 10 + 5
+ Z4 q' O0 T3 h0 I) y( H l' d) f: `# simuation Time / Day, h2 b$ ~" X, u) `3 F+ r/ q: B
T = 170
( V j5 T ^4 P0 c. \) w5 f# susceptiable ratio
$ k' U$ S5 X2 _. ~s = np.zeros([T])9 T1 `) C) \- U6 |
# infective ratio
4 a$ V5 A9 c) ?7 V* ^: {8 ci = np.zeros([T])
0 G; S- a! C. U6 r Z! h! i# remove ratio k& l' I: n! K9 E& f/ B
r = np.zeros([T])
1 p" C& M, u2 U' S+ Z) L
# e" ^3 B1 F2 _) m& @1 k) d$ e# contact rate3 |" n9 |; M: V0 g+ C
lamda = 0.2586. e6 a* A1 O4 C `2 U
# recover rate
% m1 M' z; u* ^! G. J; T7 hgamma = 0.0821$ u3 b1 i) z, T& ]) L
; \1 Q- V5 |' f, ?2 Q
# initial infective people
, O# R7 H; [' w( }/ @. {# ei[0] = 10.0 / N
2 W% Y: d( H0 _4 {8 ns[0] = 1e7 / N, d) ~: N4 y% y% A+ J2 d" R1 D2 \
for t in range(T-1):9 e) X8 T% Y) ?' | i# r
i[t + 1] = i[t] + i[t] * lamda * s[t] - gamma*i[t]
, m3 k0 p7 i( w2 N4 S s[t + 1] = s[t] - lamda * s[t] * i[t]
0 u5 Y7 \4 ?' d r[t + 1] = r[t] + gamma*i[t]* s+ b1 [' o9 j! c. c
; O7 f3 ? R3 r" I: r1 Mfig, ax = plt.subplots(figsize=(10,6))
: [" k% {) \" D1 t% Qax.plot(s, c='b', lw=2, label='S')# e" I# z# O W7 V7 f% F: h+ z
ax.plot(i, c='r', lw=2, label='I')
- S' T- M5 P2 K/ J v# V N$ zax.plot(r, c='g', lw=2, label='R')2 n$ G* }7 c) I7 |, w0 d$ l0 |
ax.set_xlabel('Day',fontsize=20)
3 T% l+ l" a+ c! }# C( z4 F8 gax.set_ylabel('Infective Ratio', fontsize=20)6 L" a% {0 ]9 m% X% J# v& x6 ]: B
ax.grid(1)1 o" [7 f* Q! u" S$ `
plt.xticks(fontsize=20)4 b5 t( ~, n/ ^4 t: F0 T
plt.yticks(fontsize=20)
& ^( J) t. M6 i2 T1 r! w2 }- v5 @plt.legend();
( V5 ]' w3 H9 S
: i9 G" G$ E9 L& \7 }- @* W% p7 F
5 Q* t* ~, P4 s( B9 b
4 \, o! {! y z1 W+ t6 _: {
感染人数峰值发生在一个月左右,最大感染人数不到人群的20%, 但是最终人群的80%都会得此病(就是最终的移出者的比例)。SIR模型适合研究没有潜伏期的急性传染病,治疗后能够痊愈并具有抗病性。 到这里,虽然不准确,我们也可以先用SIR模型来分析一下此次疫情,武汉新型冠状病毒的传染病动力学! 模型有了,其实就是确定参数的问题。一开始就有人做了这个工作: Image Name于教授给的参数是参考了非典的, ,初始易感人数为一千万, 初始感染10人,初始移出者5人,那么我们的城市总人数 , 带入我们的模型得到结果:重现于教授的模型
' s2 @6 t. N$ ~- f# I高峰和尾声日期的推测基本相符。
o6 b7 j1 o: s# susceptiable ratio7 Q2 p! c& X, ]) b& Y% R
s = np.zeros([T])
' }" W1 A! U; }4 H" b$ j- W# infective ratio
$ P0 g* r# I% n' _" ~8 |9 ?i = np.zeros([T])/ Q4 q0 N8 {/ ^* Q( a# `
# removed ratio: w; R# G/ t, f! ?' J6 b
r = np.zeros([T])+ k& |5 `$ g! E& l2 I
3 `' _1 b0 x/ N& S2 h
# birth ratio& g1 E. T( B& a" F/ F U8 \
b = 20.0 / N
6 V( U1 }8 h' u. f* V) h. A# death ratio5 E/ Z8 W+ Q* u
d = 10.0 / N
$ g% i/ _2 z: R( U3 b- O8 N
: [: G5 A E0 T" ?2 E1 Q: t# contact rate1 [0 H0 V! D7 N3 a) {8 l$ h
y = 1.5
' K1 \+ g, z( l0 t% M# U w# recover rate# T' P6 ]% O6 j
u = 0.8 # 1 / infective_period3 e! |4 M5 V0 L+ I. a! `, u* L
4 V5 m9 g6 F. [) f; @5 N# w" r
# sigma = y / u
5 ?; T+ f7 M. u! Q3 n
% R9 O9 m! A2 {6 E4 \# K7 N& Y2 t# ^# initial infective people
. F; O4 e' V0 B4 h& U: a) yi[0] = 45.0 / N
! e* J# s h5 P, ~s[0] = 1 - i[0]
7 X- o$ G( U( q, x* X$ dfor t in range(T-1):
; X+ L" P: b( [) m5 R/ l i[t+1] = i[t] + i[t] * y * s[t] - u*i[t] - d*i[t]4 Z- o; |3 o2 C J/ k7 q4 `
s[t+1] = s[t] - y * s[t] * i[t] + b - d*s[t]1 C# z# n/ b O# Q2 J" i' ?
r[t+1] = r[t] + u*i[t] - d*r[t]# E5 o' l. L: }) j0 _3 k
l. _" k% f) c& K9 {/ jplt.plot(i)8 s) a! x% I: ^. o6 F3 b* Z$ ^
plt.plot(s)! A7 U2 q# W6 z+ u: Y2 w& [- ?
plt.plot(r)
# ]8 {8 _, h% J2 I8 x1 F5 Qplt.plot(np.diff(i),ls='--')# \ e7 h* v! E; J2 m
! b! \& E; Y7 T1 A! k9 M$ B
$ E9 p, J: j% p- z) }$ L( F[<matplotlib.lines.Line2D at 0x7f77796e8518>]: l) D4 @; e" X( L3 f
X3 H8 G4 D c+ p9 G% o 0 A) ]% p) s5 T/ X! s8 w) C
% j9 I( |: z. A" f: f2 j. S1 b, _
SEIR模型但是,SIR模型和实际情况的出入会比较大,因为忽略了太多因素了,比如说潜伏期,比如说政策调控,药物,出生死亡等等。下面我们可以和前面一样,把潜伏期考虑进去,新增一个人群,叫潜伏者E(exposed): Image NameSEIR模型
. `6 R) d: j! @; E3 b同样的我们需要计算各人群每天的增加量: S:每天减少:
$ t y! R# E: Q9 m2 L, kE:每天增加传染,减少发病: ! q" {* l/ i7 p, v1 G9 D/ T# l
I:每天增加发病,减少治愈: . v( x( H* Z/ P, k1 {. b
R:每天增加治愈: . t# W" J. x+ ^
建模完成,修改我们的python程序,这里的 可以理解为潜伏期的倒数。给的4天。新型冠状病毒给目前临床的潜伏期是3-14天。
+ s1 ]5 e6 ^, |6 h. Y# population) Q6 _; s3 ^' h: ^" M( ]2 a
N = 1e7 + 10 + 5* @7 @, \1 S* d/ p
# simuation Time / Day
, X5 i9 R0 t( \$ \/ e) X/ sT = 170/ i- g2 i/ K, }) [6 [! Y+ ^
# susceptiable ratio2 k% `$ e0 V( V
s = np.zeros([T])3 i7 p/ f, F: w5 ^7 w& r
# exposed ratio
' V9 S; t6 D t) w; ?% Ue = np.zeros([T])0 C, O$ p" `- m3 r9 M( S+ }4 K
# infective ratio
. u. J5 \9 `+ C/ H" R" V' ki = np.zeros([T])
. H" @# e$ |1 g( D# remove ratio5 X; Z3 u9 u: m$ Z: v# K
r = np.zeros([T])
; R; R/ S- ^. b: I4 d# B
8 k# ?2 D) G2 k- m/ Z3 T4 V5 A# contact rate" L4 S4 \" G% b6 `
lamda = 0.5/ O/ H6 l7 x3 G$ J# {; y9 ~: J
# recover rate: ^; t6 u; h6 A8 ?! a/ H
gamma = 0.0821
3 D& C% E& N# b5 D7 U7 H# exposed period
1 Z6 q3 K' }/ |7 r$ @sigma = 1 / 4
$ L/ [4 f8 ? ]" a u$ Q1 P) g& l6 r: y( V
# initial infective people, a6 Q% E3 O9 ^6 d" r4 c g
i[0] = 10.0 / N6 B4 W+ V F; m/ C( O& R
s[0] = 1e7 / N
& S7 k6 d3 ^" de[0] = 40.0 / N* A8 j6 F1 j. X0 {: {' t
for t in range(T-1):* k, M) \. J( j
s[t + 1] = s[t] - lamda * s[t] * i[t]
! J; n y Z7 C! {+ t; X5 H0 I: O e[t + 1] = e[t] + lamda * s[t] * i[t] - sigma * e[t]6 Z( ^3 ?! Y% z% p
i[t + 1] = i[t] + sigma * e[t] - gamma * i[t]2 n$ j* h0 f+ O3 ]7 [, v
r[t + 1] = r[t] + gamma * i[t]
2 V, P- O9 @$ t4 s' x
c! E$ j( M6 N: |0 a! k3 D/ z
/ {3 B% H7 H8 @9 Z5 ]' lfig, ax = plt.subplots(figsize=(10,6))
/ C. S7 w3 }' ^6 U5 dax.plot(s, c='b', lw=2, label='S')
) m- d; I7 `5 w ^& ^ax.plot(e, c='orange', lw=2, label='E')
, Y4 d# X+ n. s W( R, N2 O Y8 Zax.plot(i, c='r', lw=2, label='I')" p# Z0 ?, ]6 O O
ax.plot(r, c='g', lw=2, label='R')& F8 H5 { m# F& {' D+ I* S1 z: }, }
ax.set_xlabel('Day',fontsize=20)
% k2 p" l& ?' |! t+ pax.set_ylabel('Infective Ratio', fontsize=20)! M+ ^% C" T, F' ?1 p$ g
ax.grid(1)
" B$ R" w. ^$ [( hplt.xticks(fontsize=20)
4 {3 {- K; x) I& Y6 a$ cplt.yticks(fontsize=20): K5 k1 W: q- j0 f# x; Y
plt.legend();) }+ Z0 i9 k W" l' b1 \
. F ~$ a% V# d
6 h* P$ ^! Y7 |![]()
. ] M: \) P* u( E" U
. H1 N( a' g z2 G, b按照模型的结果,此次疫情可能真的要持续到 三四月份。这个接触率 真的非常影响表现,模型给的是个常数,但是由于政府措施的原因,这应该是个变化的值。2 \; H1 U' w/ a4 }1 ]# p; W
还有治愈率 也是。没有完美的模型,但是随着考虑因素的增多,就会越来越接近实际情况,从而指导政府的疫情方针政策的制定。+ i z, b' j! M* k1 |
+ |) M# j1 B5 H! [' B* `: n' U) _% A7 Y) j, Z4 w; _& W6 k. d
; p( ?2 c: F% z3 Z0 I- Q/ N# U4 S$ x0 b) x) m
|