hyb
2025-12-31 6cdcd01f77e11b72c323603e27ebdb85b15223c9
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
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
Ë
Iñúh [ã óÊ    —dZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl Z ddlmZddlmZddlmZddlmZddlmZdd    lmZdd
lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddlm+Z+gd¢Z,e-e    d «rHe,j]e/e«Dcgc]'}|jad!«sŒ|jc«sŒ&|‘Œ)c}«d"Z2ejfjid#ejj«›d$«Z6ejfjid#ejj«›d%«Z7e-ed&«Z8e-ed'«Z9ejtd(«Z;ejx«Z=e j|d)k(Z?e@«ZAd*ZBej†d+d,eDe
jŠ«i«ZFeFjŽZGGd-„d.ej†«ZHeI«j•eHj–«ej˜ejšejœejžej ej¢ej¤ej¤ej¦ej¨ejªej¬d/œ ZWej°ej²ej´ej¶ej¸ejºej¼ej¾ejÀejÂejÄd0œ Zced1gd2¢«Zded3gd4¢«Zeed5gd6¢«Zfed7d8«Zged9egjÐd:z«Zied;gd<¢«Zjed=d>d?j×ejjЫz«Zled@gdA¢«ZmedBgdC¢«ZndD„ZodE„ZpdF„Zqe$dG„«Zr    erdH«dM„ZvdN„ZwdO„ZxdP„ZydQ„ZzdR„Z{dS„Z|dT„Z}dU„Z~ejfjidV«sejfjidW«rdX„ZndY„ZejZ€GdZ„d[es«ZGd\„d]«Z‚e‚«Zƒdpd^„Z„d_„Z…d`„Z†ejZ‡dqda„ZˆGdb„dc«Z‰dqdd„ZŠde„Z‹df„ZŒdg„Zdh„ZŽdi„Zdj„Zdk„Z‘dl„Z’dm„Z“Gdn„do«Z”ycc}w#es$r&Zte dIet›«edJdK«dLdLdL«auYdZt[tŒûdZt[twwxYw)rzLinux platform implementation.éN)Ú defaultdict)Ú
namedtupleé)Ú_common)Ú_psposix)Ú _psutil_linux)Ú _psutil_posix)ÚENCODING)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)Ú AccessDenied)Ú NoSuchProcess)Ú ZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Ú isfile_strict)Úmemoize)Úmemoize_when_activated)Ú open_binary)Ú    open_text)Úparse_environ_block)Úpath_exists_strict)Ú supports_ipv6)Ú usage_percent)Ú PROCFS_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚ CONN_SYN_SENTÚ CONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚ CONN_LAST_ACKÚ CONN_LISTENÚ CONN_CLOSINGÚprlimitÚRLIMz/sys/class/power_supplyú/proc/ú/smapsú /smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittleiÚ AddressFamilyÚAF_LINKcó—eZdZdZdZdZdZy)Ú
IOPriorityrrééN)Ú__name__Ú
__module__Ú __qualname__r r!r"r#©óúBH:\Change_password\venv_build\Lib\site-packages\psutil/_pslinux.pyr;r;js„ØÐØ€OØ€OØÑrBr;) ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP) Ú01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0BÚsvmem) ÚtotalÚ    availableÚpercentÚusedÚfreeÚactiveÚinactiveÚbuffersÚcachedÚsharedÚslabÚsdiskio)    Ú
read_countÚ write_countÚ
read_bytesÚ write_bytesÚ    read_timeÚ
write_timeÚread_merged_countÚwrite_merged_countÚ    busy_timeÚ    popenfile)ÚpathÚfdÚpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚ pmmap_grouped) rrÚrssÚsizerzÚ shared_cleanÚ shared_dirtyÚ private_cleanÚ private_dirtyÚ
referencedÚ    anonymousr{Ú    pmmap_extz addr perms ú Úpio)rhrirjrkÚ
read_charsÚ write_charsÚ    pcputimes)ÚuserÚsystemÚ children_userÚchildren_systemÚiowaitcóȗt|t«sJ|«‚tj|«}|j    d«d}|j d«rt |«s|dd}|S)zWrapper around os.readlink().úrú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr)rrs rCr—r—Æs`€ä dœCÔ  Ð& $Ó&Ð  Ü ;‰;tÓ €Dð :‰:fÓ ˜aÑ  €Dð ‡}}\Ô"Ô+=¸dÔ+CؐDSˆzˆØ €KrBcóJ—tjdtjdtjdi}||tjtjztjzz}|tjzr|j ddd«}|j dd«}|S)zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úarzr+)r–ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)rvÚ    modes_maprus   rCÚfile_flags_to_moder¤Úsz€ô—‘˜c¤2§;¡;°´R·Y±YÀÐE€IØ UœbŸk™k¬B¯K©KÑ7¼"¿)¹)ÑCÑDÑ E€DØ Œr{‰{ÒØ|‰|˜C  aÓ(ˆØ <‰<˜˜dÓ #€Dà €KrBcóŽ—|jdd«}d}|rd|›}nd|›d}tj|tj«S)zÜReturn True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    ú/ú!Tz /sys/block/z/device)r¢r–ÚaccessÚF_OK)ÚnameÚincluding_virtualrrs   rCÚis_storage_devicer¬çsL€ð <‰<˜˜SÓ !€DØÐÙØ˜T˜FÐ#‰à˜T˜F 'Ð*ˆÜ 9‰9Tœ2Ÿ7™7Ó #Ð#rBcóF—t|›d«5}|j«j«dd}ddd«gd¢}t«}|dk\r|j    d«|dk\r|j    d«|d    k\r|j    d
«t d |«ay#1swYŒgxYw) zøSet a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    ú/statrN)r‹ÚnicerŒÚidlerÚirqÚsoftirqéÚstealé    Úguesté
Ú
guest_niceÚ    scputimes)rÚreadliner˜ÚlenÚappendrr¹)Ú procfs_pathÚfÚvaluesÚfieldsÚvlens     rCÚset_scputimes_ntuplerÂús˜€ô
˜ } EÐ*Ó    +ð*¨qØ—‘“×#Ñ#Ó% a bÐ)ˆ÷*â K€FÜ ˆv‹;€DØ ˆq‚yà ‰ gÔØ ˆq‚yà ‰ gÔØ ˆr‚zà ‰ lÔ#ܘ;¨Ó/I÷*ð*ús "BÂB ú/proczignoring exception on import: r¹zuser system idleçcód—|d}||jdd«z}    |d}|d}|d}    t    t «›d    «}d}|5|D]C}    |    j«}    |    jd
«sŒ%|t|    j«d «z }ŒE    ddd«|tz}||z
}
||z} | t| d z |«z} |
| z }
|
|t|d z |«z
z }
t|
«S#t$r'}t|jd›d«|cYd}~Sd}~wwxYw#t $r|cYSwxYw#1swYŒ—xYw)ayFallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.
 
    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
 
    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).
 
    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
    óMemFree:óCached:rs Active(file):sInactive(file):ó SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz    /zoneinfoslowrr<g@) ÚgetÚKeyErrorrÚargsrrÚOSErrorÚstripÚ
startswithÚintr˜ÚPAGESIZEÚmin) Úmemsr`ÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrr¾Ú watermark_lowÚlineÚavailÚ    pagecaches             rCÚcalculate_avail_vmemrÜ sw€ð<  Ñ €Dؐd—h‘h˜z¨1Ó-Ñ-€Hð    ØÐ/Ñ0ˆØ Ð!3Ñ4ÐØР0Ñ1ÐðÜ œ?Ó,Ð-¨YÐ7Ó 8ˆð€MØ    
ñ6Øò    6ˆDØ—:‘:“<ˆD؏‰˜vÕ&ؤ T§Z¡Z£\°!¡_Ó!5Ñ5‘ ñ    6÷6ð
”XÑ€Mà =Ñ  €EØÐ"3Ñ3€IØ ”Y ‘] MÓ2Ñ2€IØ    ˆYÑ€EØ    Ð ¤Ð$4°sÑ$:¸MÓ JÑ JÑJ€EÜ ˆu‹:Ðøô1 òÜ Øx‰x˜‰{ˆmð>ð >ô    
ðûð ûô òØŠðú÷6ð6ús@œC"¬DÁ'D&Á.!D&Ã"    DÃ+D ÄDÄ DÄ D#Ä"D#Ä&D/c óΗg}i}tt«›d«5}|D])}|j«}t|d«dz||d<Œ+    ddd«|d}|d}    |d}    |d
}||j d d«z }    |d }        |d}
    |d}     |d}     |d} | dk(r t|«}     | dkrd} |j d«n| |kDr|} || z
}t|| z
|d¬«}|rMdjdj|«t|«dk(rdnd«}tj|td¬ «t|| ||||
| |||    | « S#1swYŒýxYw#t$rd}|j d    «YŒwxYw#t$rd}|j d «YŒwxYw#t$r-    |d}    n"#t$rd}    |j d«YnwxYwYŒJwxYw#t$rd}
|j d«YŒgwxYw#t$r9    |d|dz|dz} n"#t$rd} |j d«YnwxYwYŒ¦wxYw#t$rd} YŒ²wxYw#t$rt|«} YŒ¶wxYw)!a7Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    ú/meminforérNs    MemTotal:rÆsBuffers:rcrÇrÈrdsShmem:s
MemShared:resActive:ras    Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rbsSlab:s MemAvailable:r]©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwerer<©Ú
stacklevel)rrr˜rÏrÊr¼rÉrÜrÚformatÚjoinr»ÚwarningsÚwarnÚRuntimeWarningr[)Úmissing_fieldsrÒr¾rÙrÀr\r`rcrdrerarbrfrÚr_r^Úmsgs                 rCÚvirtual_memoryrí_s€ð€NØ €DÜ    œÓ)Ð*¨(Ð3Ó    4ð4¸Øò    4ˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘ŠOñ    4÷4ð Ñ €EØ  Ñ €Dð)ؐ{Ñ#ˆð
0ؐjÑ!ˆð    $—(‘(Ð+¨QÓ/Ñ/ˆð,ؐi‘ˆð(ؐjÑ!ˆð
.ؘ Ñ%ˆðؐH‰~ˆð
/ØÐ%Ñ&ˆð AŠ:ô
)¨Ó.‰Eà ˆq‚y؈Ø×јkÕ*Ø    Šð ˆà 5‰=€Dä˜U U™]¨U¸1Ô=€GñØF×MÑMØ I‰InÓ %ܘÓ(¨AÒ-‰E°6ó
ˆô     ‰ cœ>°aÕ8ä Ø Ø ØØ Ø ØØØØØØ ó ð ÷Q4ð4ûô ò)àˆØ×јi×(ð)ûô ò(؈Ø×јh×'ð(ûô ò,ð    ,ؘ-Ñ(‰FøÜò    ,؈FØ × !Ñ ! (Ö +ð    ,ýð,ûô ò(؈Ø×јh×'ð(ûô ò    .ð    .à_Ñ%ؐÑ'ñ(àÐ(Ñ)ñ*ñ øô
ò    .؈HØ × !Ñ ! *Ö -ð    .ýð    .ûô òØ‹ðûô ò+Ü$ TÓ*‹ð+úsћ/EÁEÁ$E6Á?FÂG G5ÂH:ÂI ÅEÅE3Å2E3Å6FÆFÆ    GÆ#F)Æ(GÆ)GÇGÇGÇGÇGÇG2Ç1G2Ç5    H7Ç?HÈH7ÈH0È-H7È/H0È0H7È6H7È: I    ÉI    É I$É#I$có°—i}tt«›d«5}|D])}|j«}t|d«dz||d<Œ+    ddd«    |d}|d}||z
}t||d¬«}        tt«›d    «}|5dx}
} |D]r}|jd
«r$t|jd «d«d zdz}
n4|jd «r#t|jd «d«d zdz} |
€Œo| €Œrn(d} | dz } tj| td¬«dx}
} ddd«tj||||    
 «S#1swYŒxYw#t$r*t j «\}}}}}}}||z}||z}YŒ0wxYw#1swYŒfxYw#t$r0} d| ›d} tj| td¬«dx}
} Yd} ~ Œd} ~ wwxYw)zReturn swap memory metrics.rÞrrßrNs
SwapTotal:s    SwapFree:ràz/vmstatspswpinó éspswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r<räzM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (ú))rrr˜rÏrÊÚcextÚ linux_sysinforrÎrèrérêrÌrÚsswap)rÒr¾rÙrÀr\r`Ú_Úunit_multiplierr_r^ÚsinÚsoutrìr×s              rCÚ swap_memoryrùàs€à €DÜ    œÓ)Ð*¨(Ð3Ó    4ð4¸Øò    4ˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘ŠOñ    4÷4ð Ø]Ñ#ˆØLÑ!ˆð 4‰<€DܘD %°Ô2€GðÜ œ?Ó,Ð-¨WÐ5Ó 6ˆðñ    ØÐ ˆC$Øò ð—?‘? 9Ô-ܘdŸj™j¨Ó.¨qÑ1Ó2°QÑ6¸Ñ=‘CØ—_‘_ ZÔ0ܘtŸz™z¨$Ó/°Ñ2Ó3°aÑ7¸$Ñ>DØ‘? tÑ'7Ùð ðEØÐ8Ñ8Ü— ‘ ˜c¤>¸aÕ@ؐd÷%    ô& =‰=˜  d¨G°S¸$Ó ?Ð?÷c4ñ4ûô ò Ü37×3EÑ3EÓ3GÑ0ˆˆ1ˆaE˜4 Ø Ñ ˆØ Ñ‹ð ú÷&    ð    ûô òð 0Ø03¨u°Að 7ð     ô     ‰ cœ>°aÕ8؈ˆdûðúsN™/E Á
EÁ0FÂA5FÃ>FÄ*FÅ EÅ/F Æ F ÆFÆ    GÆ%&GÇGcóD—t«}t|«t|›d«5}|j«j    «}ddd«dt t j«dz}|Dcgc]}t|«tz ‘Œ}}t |ŽS#1swYŒOxYwcc}w)zíReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    r®Nr)
rrÂrrºr˜r»r¹Ú_fieldsÚfloatÚ CLOCK_TICKS)r½r¾r¿rÀrKs     rCÚ    cpu_timesrþs•€ô"Ó#€KܘÔ%Ü    ˜ } EÐ*Ó    +ð&¨qØ—‘“×#Ñ#Ó%ˆ÷&à AœœI×-Ñ-Ó.°Ñ2Ð 3€FØ.4Ö 5¨ŒeA‹hœÓ$Ð 5€FÐ 5Ü fÐ Ð÷    &ð&üò6s¤BÁ.BÂBcó¦—t«}t|«g}t|›d«5}|j«|D]{}|j    d«sŒ|j «}|dt tj«dz}|Dcgc]}t|«tz ‘Œ}}t|Ž}|j|«Œ}|cddd«Scc}w#1swYyxYw)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    r®scpurN) rrÂrrºrÎr˜r»r¹rûrürýr¼)r½Úcpusr¾rÙr¿rÀrKÚentrys        rCÚ per_cpu_timesr,s̀ô"Ó#€KܘÔ%Ø €DÜ    ˜ } EÐ*Ó    +ð
¨qà    
‰
Œ Øò    #ˆD؏‰˜vÕ&ØŸ™›Ø ¤C¬    ×(9Ñ(9Ó$:¸QÑ$>Ð?Ø:@ÖA°Qœ% ›(¤[Ó0ÐAÐAÜ! 6Ð*Ø— ‘ ˜EÕ"ð     #ð÷
ñ
ùòB÷
ð
ús#¦'CÁ3CÂCÂCÃCÃCcó—    tjd«S#t$ràd}tt    «›d«5}|D]'}|j «j d«sŒ#|dz }Œ)    ddd«n #1swYnxYw|dk(rttjd«}tt    «›d«5}|D]-}|jd    «d}|j|«sŒ)|dz }Œ/    ddd«n #1swYnxYw|dk(rYy|cYSwxYw)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNrú/cpuinfos    processorrNzcpu\dr®r†) r–ÚsysconfÚ
ValueErrorrrÚlowerrÎÚreÚcompilerr˜Úmatch)Únumr¾rÙÚsearchs    rCÚcpu_count_logicalr@s    €ð܏z‰zÐ/Ó0Ð0øÜ òàˆÜ œOÓ-Ð.¨hÐ7Ó 8ð    ¸AØò Ø—:‘:“<×*Ñ*¨<Õ8ؘ1‘H‘Cñ ÷    ÷    ñ    úð !Š8Ü—Z‘Z Ó)ˆFÜœoÓ/Ð0°Ð6Ó7ð !¸1Øò!DØŸ:™: c›?¨1Ñ-DØ—|‘| DÕ)ؘq™™ñ!÷ !÷ !ñ !úð !Š8áØŠ
ð-úsP‚—!D¸%A/ÁA/Á&    DÁ/A8    Á47DÂ++C(ÃC(à   DÃ(C1    Ã- DÃ;DÃ?DcóÒ—t«}d}d}tj|«xstj|«D]C}t|«5}|j|j    «j ««ddd«ŒEt |«}|dk7r|Si}i}tt«›d«5}|D]f}|j «j«}|s    |d||d<i}Œ2|jd«sŒD|jd    d
«\}    }
t|
«||    <Œh    ddd«t|j««}|xsdS#1swYŒxYw#t$rYŒzwxYw#1swYŒDxYw) z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrró    cpu coresó physical id)rrs    :r)ÚsetÚglobrÚaddÚreadrÍr»rrrÊrÎr˜rÏÚsumr¿) ÚlsÚp1Úp2rrr¾ÚresultÚmappingÚ current_inforÙÚkeyÚvalues            rCÚcpu_count_coresr]sn€ô
‹€Bð
E€BØ    J€BÜ—    ‘    ˜"“ Ò.¤§¡¨2£ò%ˆÜ ˜Ó ð    % !Ø F‰F1—6‘6“8—>‘>Ó#Ô $÷    %ð    %ð%ô‹W€FØ ‚{؈ ð€GØ€LÜ    œÓ)Ð*¨(Ð3Ó    4ð/¸Øò    /ˆDØ—:‘:“<×%Ñ%Ó'ˆDÙðØ<HØ$ñ=G˜L¨Ñ8Ñ9ð
 "‘ Ø—‘Ð!?Õ@à!ŸZ™Z¨°Ó2‘
UÜ$'¨£J ˜SÒ!ñ    /÷/ô"—‘Ó!Ó "€FØ Š>TÐ÷7    %ñ    %ûô$ òÙðú÷/ð/úsBÁ    .EÂ-&Eà EÃEÃ4%EÅE     Å    EÅEÅEÅEÅE&cóÌ—tt«›d«5}d}d}d}|D]•}|jd«rt|j    «d«}n[|jd«rt|j    «d«}n-|jd«rt|j    «d«}|€Œ|€Œ’|€Œ•nddd«d}t j |«S#1swYŒ#xYw)z*Return various CPU stats as a named tuple.r®Nsctxtrsintrssoftirqr)rrrÎrÏr˜rÚ    scpustats)r¾Ú ctx_switchesÚ
interruptsÚsoft_interruptsrÙÚsyscallss      rCÚ    cpu_statsr&‡sâ€ä    œÓ)Ð*¨%Ð0Ó    1ð°Q؈ ؈
؈Øò     ˆD؏‰˜wÔ'Ü" 4§:¡:£<°¡?Ó3‘ Ø—‘ Ô)Ü  §¡£¨a¡Ó1‘
Ø—‘ Ô,Ü"% d§j¡j£l°1¡oÓ"6àÑ(Ø#Ñ/ØÑ*áð     ÷    ð"€HÜ × Ñ Øj /°8ó ð÷%ðús—BCÂ/CÂ2CÂ5CÃC#c
óú—tt«›d«5}|Dcgc]?}|j«jd«rt    |j dd«d«‘ŒAc}cddd«Scc}w#1swYyxYw)z7Return current CPU frequency from cpuinfo if available.rscpu mhzó:rN)rrrrÎrür˜)r¾rÙs  rCÚ_cpu_get_cpuinfo_freqr) sw€ä    œÓ)Ð*¨(Ð3Ó    4ð
¸ðö
àØz‰z‹|×&Ñ& zÔ2ô $—*‘*˜T 1Ó% aÑ(Õ )ò
÷
ñ
ùò
÷
ð
ús—A1œAA,Á A1Á,A1Á1A:z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc    ó—t«}tjd«xstjd«}|jd„¬«g}tjj
}t |«D] \}}t|«t|«k(r    ||dz}nt||d«d¬«}|€`t||d    «d¬«}|€Jd
|›d }t|d¬«d k(r'|jtjd d d ««Œd}t|«‚t|«dz }tt||d«««dz }    tt||d«««dz }
|jtj||
|    ««Œ|S)z‚Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqcó\—ttjd|«j««S)Nz[0-9]+)rÏr    r Úgroup©rKs rCú<lambda>zcpu_freq.<locals>.<lambda>·s€¤¤R§Y¡Y¨y¸!Ó%<×%BÑ%BÓ%DÓ!E€rB)rièÚscaling_cur_freqN©rÓÚcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
rÄz!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)r)rÚsortr–rrrçÚ    enumerater»rrr¼rÚscpufreqÚNotImplementedErrorrÏ) Ú cpuinfo_freqsÚpathsÚretÚpjoinÚirrÚcurrÚ online_pathrìÚmax_Úmin_s            rCÚcpu_freqrA®sw€ô
.Ó/ˆ Ü—    ‘    Ø :ó
òDä Y‰YÐBÓ Cð    ð    
‰
ÑEˆ
ÔF؈ܗ‘— ‘ ˆÜ  Ó'ó    ;‰GˆAˆtܐ5‹zœS Ó/Ò/ð% QÑ'¨$Ñ.‘ä™E $Ð(:Ó;ÀdÔKØˆ|ô™E $Ð(:Ó;ÀdÔKØ<Ø$?À¸sÀ'Ð"JKä˜;°Ô6¸%Ò?ØŸ
™
¤7×#3Ñ#3°C¸¸cÓ#BÔCØ Ø=CÜ-¨cÓ2Ð2ܐt“9˜tÑ#ˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDØ J‰J”w×'Ñ'¨¨d°DÓ9Ö :ð-    ;ð.ˆ
rBcóf—t«Dcgc]}tj|dd«‘Œc}Scc}w)z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        rÄ)r)rr6r-s rCrArAÕs+€ô8MÓ7NÖO°!”× Ñ   C¨Õ-ÒOÐOùÒOs.có —eZdZy)Ú_Ipv6UnsupportedErrorN)r>r?r@rArBrCrDrDäs„ØrBrDcó^—eZdZdZd„Zd„Zd„Zed„«Zed
d„«Z    ed
d„«Z
d
d    „Z y) ÚNetConnectionsawA wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".
 
    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.
 
    [1] http://serverfault.com/a/417946
    c ó’—dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtj
df}|||||f||f|f|f||f|f|f|f||||f||f||fdœ |_d|_y)NÚtcpÚtcp6ÚudpÚudp6Úunix) ÚallrHÚtcp4rIrJÚudp4rKrLÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚ SOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ _procfs_path)ÚselfrNrIrOrKrLs      rCÚ__init__zNetConnections.__init__ôs΀ð”v—~‘~¤v×'9Ñ'9Ð:ˆØœŸ™¬×);Ñ);Ð<ˆØ”v—~‘~¤v×'8Ñ'8Ð9ˆØœŸ™¬×):Ñ):Ð;ˆØœŸ™¨Ð-ˆà˜$  d¨DÐ1ؘ$<ؐGؐGؘ$<ؐGؐGؐGؘ4  tÐ,ؘD\ؘD\ñ 
ˆŒ    ð!ˆÕrBcó—tt«}tj|j›d|›d«D]Y}    t |j›d|›d|›«}|j d«sŒ3|dddd}||j|t|«f«Œ[|S#ttf$rYŒot$rU}|jtjk(rYd}~Œ™|jtjk(rt|«Yd}~ŒÆ‚d}~wwxYw)Nr¦ú/fdú/fd/zsocket:[r³éÿÿÿÿ)rÚlistr–ÚlistdirrZr—rÎr¼rÏÚFileNotFoundErrorÚProcessLookupErrorrÌÚerrnoÚEINVALÚ ENAMETOOLONGr)r[ÚpidÚinodesrsÚinoder×s      rCÚget_proc_inodeszNetConnections.get_proc_inodes sø€ÜœTÓ"ˆÜ—*‘* × 1Ñ 1Ð2°!°C°5¸Ð<Ó=ò    9ˆBð 9Ü  D×$5Ñ$5Ð#6°a¸°u¸DÀÀÐ!EÓFð ×#Ñ# JÕ/à! ! "˜I c r˜NEؘ5‘M×(Ñ(¨#¬s°2«w¨Õ8ð+    9ð,ˆ øô'&Ô'9Ð:ò ñÜò Ø—9‘9¤§ ¡ Ò,䨗9‘9¤× 2Ñ 2Ò2ä˜#”JÜØûð ús)¹BÂDÂ$DÂ,C<Ã(C<Ã;C<Ã<Dcóž—i}t«D]#}    |j|j|««Œ%|S#ttt
f$rYŒ>wxYw©N)ÚpidsÚupdaterkrcrdÚPermissionError)r[rirhs   rCÚget_all_inodeszNetConnections.get_all_inodes%sY€ØˆÜ“6ò     ˆCð
Ø— ‘ ˜d×2Ñ2°3Ó7Õ8ð     ðˆ øô&Ô'9¼?ÐKò ñð ús‘ 5µA Á A c
ó$—|jd«\}}t|d«}|sy|jd«}|tjk(r`t
r0tj |tj|«ddd…«}nßtj |tj|««}nµtj|«}    t
rMtj tjtjdgtjd|«¢­Ž«}nLtj tjtjdgtjd|«¢­Ž«}t!j"||«S#t$rt«std‚‚wxYw)    a†Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:
 
        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)
 
        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.
 
        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        ú:érAÚasciiNr`z>4Iz<4I)r˜rÏÚencoderSrTÚ LITTLE_ENDIANÚ    inet_ntopÚbase64Ú    b16decoderVÚstructÚpackÚunpackrrrDrÚaddr)r~ÚfamilyÚipÚports    rCÚdecode_addresszNetConnections.decode_address5s<€ð"—:‘:˜c“?‰ˆˆDܐ4˜‹}ˆñØØ Y‰YwÓ ˆØ ”V—^‘^Ò #åÜ×%Ñ% f¬f×.>Ñ.>¸rÓ.BÁ4ÀRÀ4Ñ.HÓI‘ä×%Ñ% f¬f×.>Ñ.>¸rÓ.BÓC‘ä×!Ñ! "Ó%ˆBð å Ü×)Ñ)ÜŸ™ÜŸ ™  EÐE¬F¯M©M¸%ÀÓ,DÒEó‘Bô
 ×)Ñ)ÜŸ™ÜŸ ™  EÐE¬F¯M©M¸%ÀÓ,DÒEóBô|‰|˜B Ó%Ð%øô ò ä$”Ü/°TÐ9Øð     ús Â>BE3Å3FNc #ó K—|jd«r tjj|«syt    |«5}|j «t |d«D]¦\}}    |j«dd\
}}    }
} }}}}}} | |vr || d\}}nd    \}}|||k7rŒB|tjk(r
t| } ntj}     tj!|    |«}    tj!|
|«}
||||    |
| |f–—Œ¨    ddd«y#t$rd|›d|›d|›} t| «d‚wxYw#t"$rYŒâwxYw#1swYyxYw­w)
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nrr·úerror while parsing ú; malformed line r†r©Nr`)r™r–rrÚexistsrrºr5r˜rÚ RuntimeErrorrSrUÚ TCP_STATUSESrÚ    CONN_NONErFr‚rD)ÚfilerÚtype_riÚ
filter_pidr¾ÚlinenorÙrõÚladdrÚraddrÚstatusrjrìrhrss                rCÚ process_inetzNetConnections.process_inethsèø€ð =‰=˜Ô ¤b§g¡g§n¡n°TÔ&:à Ü t‹_ð#    I Ø J‰JŒLÜ )¨!¨Q£ò! I‘ ˜ð    6àŸ
™
›  S bÐ)ñBAu˜e V¨Q°°1°a¸¸Eð˜F‘?ð% U™m¨AÑ.‘GC™à&‘GC˜ØÐ)¨j¸CÒ.?Øà¤× 2Ñ 2Ò2Ü!-¨fÑ!5™ä!(×!2Ñ!2˜ð!Ü .× =Ñ =¸eÀVÓ L˜Ü .× =Ñ =¸eÀVÓ L˜ð˜v u¨e°U¸FÀCÐHÓHñC! I÷#    Ið#    Iøô"ò6à.¨t¨fð5Ø"˜8 1 T Hð.ðô' sÓ+°Ð5ð 6ûô41ò!Ù ð!ú÷C#    Ið#    IüsY‚=E¿#EÁ#DÂA
EÃ ,D3Ã8 EÄ    EÄ!D0Ä0EÄ3    D?Ä<EÄ>D?Ä?EÅE ÅEc
#óâK—t|«5}|j«|D]}|j«}    |dd\}}}}}}}    |    |vr||    } ndg} | D]]\} } ||| k7rŒt |«dk(r|d    nd
}t jt|««}d
}t j}| |||||| f–—Œ_Œ‘    ddd«y#t$rd|vrYŒ«d|›d|›}
t    |
«‚wxYw#1swYyxYw­w) zParse /proc/net/unix files.rér†r…r†r‡Nr³r`Ú)
rrºr˜rr‰r»rÚsocktype_to_enumrÏr‹)rŒrrirŽr¾rÙÚtokensrõrrjrìÚpairsrhrsrrr‘r’s                 rCÚ process_unixzNetConnections.process_unix“sBèø€ôt‹_ð    L Ø J‰JŒLØò LØŸ™›ð    ,Ø28¸¸1°+Ñ/Aq˜!˜Q  q¨%ð˜F‘?ð# 5™M‘Eà'˜LEØ$ò L‘GC˜Ø!Ð-°*ÀÒ2CØ ä-0°«[¸AÒ-=˜v bšzÀ2˜Ü '× 8Ñ 8¼¸U»Ó D˜ð!#˜Ü!(×!2Ñ!2˜Ø! 6¨5°$¸¸vÀsÐKÓKñ Lñ% L÷    Lð    Løô "ò,Ø $‘á à.¨t¨fÐ4EÀdÀXÐNðô' sÓ+Ð+ð,ú÷     Lð    Lüs@‚ C/Ž&C#µ B=ÁA1C#Â4    C/Â= C Ã
C#à C àC#Ã#C,Ã(C/c ó6—t«|_||j|«}|sgS|j«}t    «}|j
|D]½\}}}|j›d|›}|t jt jhvr|j|||||¬«}    n|j||||¬«}    |    D]S\}
}}} } } }|rtj|
||| | | «}ntj|
||| | | |«}|j|«ŒUŒ¿t|«S)Nz/net/)rŽ)rrZrkrqrrYrSrTrVr“ršrÚpconnÚsconnrra)r[Úkindrhrir:Ú
proto_namerrrrrrsrr‘r’Ú    bound_pidÚconns                rCÚretrievezNetConnections.retrieve·s8€Ü+Ó-ˆÔØ ˆ?Ø×)Ñ)¨#Ó.ˆFÙà    à×(Ñ(Ó*ˆFÜ‹eˆØ)-¯©°4©ò    Ñ %ˆJ˜ Ø×'Ñ'Ð(¨¨j¨\Ð:ˆDØœ&Ÿ.™.¬&¯/©/Ð:Ñ:Ø×&Ñ&ؘ& %¨¸Cð'ó‘ð×&Ñ& t¨V°VÈÐ&ÓLØFHò     ÑBF˜E 5¨%°¸ÙÜ"Ÿ=™=ؘF E¨5°%¸ó‘Dô#Ÿ=™=ؘF E¨5°%¸ÀóD𗑘• ñ     ð    ô$C‹yÐrBrm) r>r?r@Ú__doc__r\rkrqÚ staticmethodr‚r“ršr¢rArBrCrFrFès^„ñ    ò!ò.ò4ð ñ0&óð0&ðdò(Ióð(IðTò!Lóð!LôFrBrFcó,—tj|«S)z$Return system-wide open connections.)Ú_net_connectionsr¢)ržs rCÚnet_connectionsr§Ùs€ä × $Ñ $ TÓ *Ð*rBcóª—tt«›d«5}|j«}ddd«i}ddD]}|jd«}|dkDsJt    |««‚|d|j «}||dzdj «j «}tt|«\}}}    }
} } } }}}}}}}}}|||||    ||
|f||<Œ|S#1swYŒ¢xYw)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNr<rsrr)    rrÚ    readlinesÚrfindÚreprrÍr˜ÚmaprÏ)r¾ÚlinesÚretdictrÙÚcolonrªrÀÚ
bytes_recvÚ packets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ _compressedinÚ _multicastinÚ
bytes_sentÚ packets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ _carrieroutÚ_compressedouts                       rCÚnet_io_countersrÀÞs€ô
”oÓ'Ð(¨Ð1Ó    2ð°aØ— ‘ “ ˆ÷à€Gؐab    ò$
ˆØ—
‘
˜3“ˆØqŠyÐ$œ$˜t›*Ó$ˆyؐFUˆ|×!Ñ!Ó#ˆØe˜a‘ikÐ"×(Ñ(Ó*×0Ñ0Ó2ˆô* ”VÓ ñ'    
à Ø Ø Ø Ø Ø Ø Ø à Ø Ø Ø Ø Ø Ø Ø ð Ø Ø Ø Ø Ø Ø Ø ð    
ˆŠ ð7$
ðJ €N÷Qðús —C    à   Ccó0—tjttjttj
t i}t«j«}i}|D]y}    tj|«}tj|«}tj|«\}}dj|«}d|v}    tj|    |||||«||<Œ{|S#t $r3}
|
j"t"j$k7r‚t'|
«Yd}
~
εd}
~
wwxYw)z)Get NIC stats (isup, duplex, speed, mtu).ú,ÚrunningN)ròÚ DUPLEX_FULLr Ú DUPLEX_HALFr ÚDUPLEX_UNKNOWNr rÀÚkeysÚ
cext_posixÚ
net_if_mtuÚ net_if_flagsÚnet_if_duplex_speedrçrÚ    snicstatsrÌreÚENODEVr) Ú
duplex_mapÚnamesr:rªÚmturvÚduplexÚspeedÚ output_flagsÚisupr×s            rCÚ net_if_statsrÕ sÿ€ô     ×Ñœ/Ü ×Ñœ/Ü ×ÑÔ/ð€Jô
Ó × "Ñ "Ó $€EØ
€CØòˆð    Ü×'Ñ'¨Ó-ˆCÜ×+Ñ+¨DÓ1ˆEÜ ×4Ñ4°TÓ:‰MˆFEðŸ8™8 E›?ˆLØ Ð%ˆDÜ×)Ñ)ؐj Ñ(¨%°°lóˆCŠIðð  €Jøôò    ày‰yœEŸL™LÒ(ØÜ #J‰Jûð        úsÁACà   DÃ")DÄDc ó|—d„}d„}tjjt«›d«r|«}n?tjjd«r|«}nt«›d}t    |«‚i}|D]=}|\
}}}    }
} } } }}}|s t |«sŒ|
t z}
| t z} ||    |
| | | |||f    ||<Œ?|S)zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c 3ó(K—tt«›d«5}|j«}ddd«D]Î}|j«}t    |«}|dk(r2|d}t |d«}t t
|dd«\
}}}    }
} } } }}}nl|dk(s|dk\r%|d}t t
|dd«\ }}}}    }
} } } }}}n=|dk(r(|d}t t
|dd«\}}}
} d    x}    x} x}x} }nd
|›}t|«‚|||
|| |    | || |f
–—ŒÐy#1swYŒÝxYw­w) Nú
/diskstatsér=r<rðéér•rznot sure how to interpret line )rrr©r˜r»rÏr¬r)r¾r­rÙrÀÚflenrªÚreadsÚ reads_mergedÚrbytesÚrtimeÚwritesÚ writes_mergedÚwbytesÚwtimerõrprìs                 rCÚ read_procfsz%disk_io_counters.<locals>.read_procfs6sbèø€ô"œ/Ó+Ð,¨JÐ7Ó 8ð    "¸AØ—K‘K“MˆE÷    "àò    ;ˆDØ—Z‘Z“\ˆFܐv“;ˆDàrŠzà˜a‘yÜ˜F 1™I›ä69¼#¸vÀaȸ|Ó6Lñ4˜v u¨f°mؘE 1 i±Ø˜’˜t ršzà˜a‘yä69¼#¸vÀaȸ|Ó6Lñ4˜  f¨e°V¸]ؘE 1 i±Ø˜’à˜a‘yÜ03´C¸ÀÀ¸Ó0DÑ-v˜v vØKLÐLÐL˜ÐL  ÐL¨}¹yà7¸°xÐ@Ü  “oÐ%ؘ ¨°¸¸uØ °    ð;ó ;ñ/    ;÷    "ð    "üs‚D™DªCDÄDÄ Dc 3ó,K—tjd«D]ì}tjtjj    d|««D]´\}}}d|vrŒ t tjj    |d««5}|j «j«j«}ddd«tjj|«}ttdd«\
}}}    }
} } } }}}||| |    | |
||| |f
–—Œ¶Œîy#1swYŒYxYw­w)Nú
/sys/blockÚstatr·) r–rbÚwalkrrrçrrrÍr˜Úbasenamer¬rÏ)ÚblockÚrootrõÚfilesr¾rÀrªrÝrÞrßràrárârãrärps                rCÚ
read_sysfsz$disk_io_counters.<locals>.read_sysfsdsèø€Ü—Z‘Z  Ó-ò     FˆEÜ"$§'¡'¬"¯'©'¯,©,°|ÀUÓ*KÓ"Lò
F‘a˜Ø Ñ&ØÜœrŸw™wŸ|™|¨D°&Ó9Ó:ð6¸aØŸV™V›XŸ^™^Ó-×3Ñ3Ó5F÷6ä—w‘w×'Ñ'¨Ó-ô47´s¸FÀ3ÀB¸KÓ3Hñ1˜  f¨e°V¸]ؘE 1 iؘU F¨F°F¸Eؘl¨M¸9ðFóFñ
Fñ     F÷6ð6üs‚BDÂ-DÂ0ADÄD Ä DrØrçz6/diskstats nor /sys/block are available on this system)r–rrrˆrr7r¬ÚDISK_SECTOR_SIZE)ÚperdiskrårîÚgenrìr®rrªrÝrárßrãràrärÞrârps                 rCÚdisk_io_countersrò1sò€ò
+;ò\ Fô
‡ww‡~~œÓ*Ð+¨:Ð6Ô7Ù‹m‰Ü     ‰‰˜ Ô    %Ù‹l‰ôÓ Ð!ð"ð ð     ô" #Ó&Ð&à€GØòAˆð).ñ    &ˆˆuf˜f f¨e°U¸LØ ˜9ÙÔ0°Ô6ð àÔ"Ñ"ˆØÔ"Ñ"ˆØ ¨°¸¸uØ% }°iðAˆŠ ð)Að0 €NrBcó6—eZdZdZddgZd„Zd„Zd„Zd„Zd„Z    y    )
ÚRootFsDeviceFinderaFdisk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    ÚmajorÚminorcóª—tjd«j}tj|«|_tj|«|_y©Nr¦)r–rèÚst_devrõrö)r[Údevs  rCr\zRootFsDeviceFinder.__init__¤s3€Üg‰gc‹l×!Ñ!ˆÜ—X‘X˜c“]ˆŒ
Ü—X‘X˜c“]ˆ
rBcóÄ—tt«›d«5}|j«ddD]ž}|j«}t    |«dkrŒ"|dj «rt |d«nd}|dj «rt |d«nd}|d}||jk(sŒ}||jk(sŒ|sŒd|›ccddd«S    ddd«y#1swYyxYw)Nz /partitionsr<rðrrr=ú/dev/)    rrr©r˜r»ÚisdigitrÏrõrö)r[r¾rÙrÀrõrörªs       rCÚask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions©sÖ€Ü œ/Ó+Ð,¨KÐ8Ó 9ð
    .¸QØŸ ™ ›  a bÐ)ò     .ØŸ™›Üv“; ’?ØØ*0°©)×*;Ñ*;Ô*=œ˜F 1™IœÀ4Ø*0°©)×*;Ñ*;Ô*=œ˜F 1™IœÀ4Ø˜a‘yØ˜DŸJ™JÓ&¨5°D·J±JÓ+>ÚØ!& t f˜~Ñ-÷
    .ñ
    .ñ     .÷
    .÷
    .ñ
    .ús$—BCÂ(CÂ8CÂ;Cà CÃCcó—d|j›d|j›d}t|«5}|D]H}|jd«sŒ|j    «j d«d}|sŒ:d|›ccddd«S    ddd«y#1swYyxYw)Nz/sys/dev/block/rsz/ueventzDEVNAME=r<rü)rõrörrÎrÍÚ
rpartition)r[rrr¾rÙrªs     rCÚask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block¶s‹€Ø  §¡  ¨A¨d¯j©j¨\¸ÐAˆÜ t‹_ð    . Øò .Ø—?‘? :Õ.ØŸ:™:›<×2Ñ2°:Ó>¸qÑADÚØ!& t f˜~Ñ-÷     .ñ    .ñ .÷    .÷    .ñ    .ús©BÁ$BÁ&BÁ6BÂB
có¶—|j›d|j›}tjd«}|D]‰}    t    |«}|5|j «j «}||k(rLtjjtjj|««}d|›cddd«cS    ddd«Œ‹y#1swYŒ–xYw#t$rYŒ¤wxYw)Nrsz/sys/class/block/*/devrü) rõrörÚiglobrrrÍr–rrrêÚdirnamerc)r[ÚneedlerírŒr¾Údatarªs       rCÚask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block¿sȀØ—J‘J<˜q §¡  Ð-ˆÜ—
‘
Ð3Ó4ˆØò
    .ˆDð     .ܘd“Oðñ.ØŸ6™6›8Ÿ>™>Ó+Dؘv’~Ü!Ÿw™w×/Ñ/´·±·±ÀÓ0EÓF˜Ø!& t f˜~÷    .ó.à%÷.ð.ñ
    .÷ .ð.ûô%ò Ùð ús· C ÁA$CÃC        Ã     CÃCcóˆ—d}|€    |j«}|€    |j«}|€    |j    «}|"t
j j|«r|Syy#t$r}t|«Yd}~Œdd}~wwxYw#t$r}t|«Yd}~Œrd}~wwxYw#t$r}t|«Yd}~Œ€d}~wwxYwrm)rþrÌrrrr–rrrˆ)r[rrr×s   rCÚfindzRootFsDeviceFinder.findÎsƀØˆØ ˆ<ð Ø×/Ñ/Ó1ð ˆ<ð Ø×-Ñ-Ó/ð ˆ<ð Ø×/Ñ/Ó1ð
Ð ¤§¡§¡¨tÔ 4؈Kð!5Ð øôò ܐc—
‘
ûð ûô
ò ܐc—
‘
ûð ûô
ò ܐc—
‘
ûð úsE†A!™B¬B#Á!    A?Á* A:Á:A?    B  BÂB Â#    CÂ, B<Â<CN)
r>r?r@r£Ú    __slots__r\rþrrr    rArBrCrôrôšs,„ñð˜'Ð"€Iò#ò
.ò.ò .órBrôcó(—t«}t«}|s‹t|›d«5}|D]n}|j«}|j    d«s |j |j««ŒD|j d«d}|dk(sŒ^|j d«Œp    ddd«|dk(r?tjjd«r tjjd«}n"tjj|›d    «}g}tj|«}|D]b}    |    \}
} }} |
d
k(rd }
|
d vrt«j«xs|
}
|s|
r||vrŒ:tj |
| || «} |j#| «Œd|S#1swYŒïxYw) z8Return mounted disk partitions as a list of namedtuples.z /filesystemsÚnodevú    rÚzfsNrÃz    /etc/mtabz /self/mountsÚnoner–>ú    /dev/rootÚrootfs)rrrrÍrÎrr˜r–rrÚisfileÚrealpathròÚdisk_partitionsrôr    rÚ    sdiskpartr¼)rMÚfstypesr½r¾rÙÚfstypeÚ mounts_pathÚretlistÚ
partitionsÚ    partitionÚdeviceÚ
mountpointÚoptsÚntuples              rCrråsy€ä‹e€GÜ!Ó#€KÙ Ü ˜+˜ lÐ3Ó 4ð        +¸Øò +Ø—z‘z“|Ø—‘ wÔ/Ø—K‘K §
¡
£ Õ-ð"ŸZ™Z¨Ó-¨aÑ0FØ “ØŸ ™  EÕ*ñ +÷        +ðgÒ¤"§'¡'§.¡.°Ô"=Ü—g‘g×&Ñ& {Ó3‰ ä—g‘g×&Ñ&¨+¨°lÐ'CÓDˆ à€GÜ×%Ñ% kÓ2€JØò
ˆ    Ø+4Ñ(ˆ
˜F DØ VÒ ØˆFØ Ð,Ñ ,Ü'Ó)×.Ñ.Ó0Ò:°FˆFÙÙ˜V¨7Ñ2ØÜ×"Ñ" 6¨:°v¸tÓDˆØ‰vÕð
ð €N÷?        +ð        +ús¥A FÂFÆFc    ó²—tjt«}tjd«}|j    tjd««t |Dchc]}|j d«d’Œc}«}tjd«}tjd«}|D]*}|jd|«}||vsŒ|j|«Œ,|D]í}    |dz}tt|««d    z }    tjjtjj!|«d
«}t#|«j%«}
t|d zd ¬ «} t|dzd ¬ «} t#|dzd¬ «j%«} |     t| «d    z } |     t| «d    z } ||
j| |    | | f«Œï|sótjd«}t t+|««}|D]Ä}    tjj|d«}tt|««d    z }    tjj|d«}t#|«j%«}
tj|dz«}|Dchc]B}djtjj/|«j d«dd«’ŒD}}d } d } |D]Ê}tjj||dz«}t#|d¬ «j%«}|dk(r/ttjj||dz«d ¬ «} n3|dk(r.ttjj||dz«d ¬ «} |     t| «d    z } | €Œ¼    t| «d    z } ŒÌ||
jd|    | | f«ŒÇt1|«Scc}w#t&t(f$rYŒwxYw#t($rd } YŒUwxYw#t($rd } YŒVwxYw#t&t(f$r}t-|«Yd }~Œ2d }~wwxYwcc}w#t($rd } YŒ³wxYw#t($rd } YŒ~wxYw)aøReturn hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.
 
    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*rõrz5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg@@rªÚ_maxNr0Ú_critÚ_labelr–z /sys/class/thermal/thermal_zone*ÚtempÚtypez /trip_point*r=Ú_typeÚcriticalÚ_tempÚhigh)Ú collectionsrrarÚextendÚsortedr˜r    r
Úsubr¼rürr–rrrçrrrÍrÌrrrrêÚdict)r:Ú    basenamesrKÚ
basenames2ÚreplrªÚaltnameÚbaserrÚcurrentÚ    unit_namer*r(Úlabelr×Ú
trip_pathsÚpÚ trip_pointsÚ
trip_pointÚ    trip_types                    rCÚsensors_temperaturesr=s(€ô ×
!¤$Ó
'€CÜ—    ‘    Ð;Ó<€Ið×Ñ”T—Y‘YÐGÓHÔIܰÖ;¨A˜Ÿ™ ›  Q›Ò;Ó<€Iô —‘Ø?ó€Jô :‰:Ð@Ó A€DØò#ˆØ—(‘(Ð.°Ó5ˆØ ˜)Ò #Ø × Ñ ˜TÕ "ð#ð
ò @ˆð    Ø˜(‘?ˆDÜœD ›JÓ'¨&Ñ0ˆGÜ—7‘7—<‘<¤§¡§¡°Ó 5°vÓ>ˆDܘD›    Ÿ™Ó)ˆIôD˜6‘M¨DÔ1ˆÜ˜˜w™°Ô6ˆÜD˜8‘O¨bÔ1×7Ñ7Ó9ˆà Ð ð ܘT“{ VÑ+ð Ð ð  Ü  ›?¨VÑ3ð     ˆI‰×јu g¨t°XÐ>Õ?ðA @òF Ü—I‘IÐ@ÓAˆ    Üœ3˜y›>Ó*ˆ    àó(    AˆDð Ü—w‘w—|‘| D¨&Ó1Ü¤ T£
Ó+¨fÑ4Ü—w‘w—|‘| D¨&Ó1Ü ›IŸO™OÓ-    ô
Ÿ™ 4¨.Ñ#8Ó9ˆJð$öàð—‘œŸ™×)Ñ)¨!Ó,×2Ñ2°3Ó7¸¸!Ð<Õ=ðˆKððˆH؈DØ)ò (
Ü—w‘w—|‘| D¨*°wÑ*>Ó?Ü ¨rÔ2×8Ñ8Ó:    Ø 
Ò*Ü#ÜŸ™Ÿ ™  T¨:¸Ñ+?Ó@È4ô ‘Hð &Ò(ÜÜŸ™Ÿ ™  T¨:¸Ñ+?Ó@È4ôDðÐ#ð$Ü$ T›{¨VÑ3˜ðÑ'ð(Ü#(¨£?°VÑ#;™ð' (ð.     ‰N× !Ñ ! 2 w°°hÐ"?Ö @ðQ(    AôT ‹9ÐùòA<øô*œÐ$ò        ò ð        ûô$ò Ø“ð ûô
ò  Ø“ð  ûô œZÐ(ò ܐc”
Ýûð üò
øô*&ò$Ø#šð$ûô
&ò(Ø#'›ð(úsÁO
ÃA2OÆO%Æ!O7Ç<A0P    ÊAP1ÎP6ÎQÏO"Ï!O"Ï% O4Ï3O4Ï7 PÐPР   P.Ð P)Ð)P.Ð6 QÑQÑ QÑQcó¶—tjt«}tjd«}|stjd«}t    |Dchc]}|j d«d’Œc}«}|D]´}    t t|dz««}ttjjtjj|«d««j«}t|dzd    ¬
«j«}||j!t#j$||««Œ¶t'|«Scc}w#t$r}t|«Yd}~Œàd}~wwxYw) a‡Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.
 
    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*rõrr!Nrªr$r–r0)r+rrarr-r˜rÏrrÌrrr–rrrçrrÍr¼rÚsfanr/)r:r0rKr4r5r×r6r7s        rCÚ sensors_fansr@‡s€ô ×
!¤$Ó
'€CÜ—    ‘    Ð:Ó;€IÙ ô—I‘IÐEÓFˆ    ä°Ö;¨A˜Ÿ™ ›  Q›Ò;Ó<€IØò<ˆð    Üœ$˜t h™Ó/Ó0ˆGôœŸ™Ÿ ™ ¤R§W¡W§_¡_°TÓ%:¸FÓCÓD×JÑJÓLˆ    ÜD˜8‘O¨bÔ1×7Ñ7Ó9ˆØ ˆI‰×ÑœgŸl™l¨5°'Ó:Õ;ð<ô ‹9Ðùò<øôò    Ü #ŒJÜ ûð    úsÁD5Á7D:Ä:    EÅ EÅEcól‡ —t«Š ˆ fd„}tjt«Dcgc]'}|j    d«sd|j «vr|‘Œ)}}|sytj jtt|««}||dz|dz«}||dz|dz«}||d    z|d
z«}||d z«}| |
    d |z|z }ntt|dzd¬««}|dk(ryd}    |tj jtd«tj jtd««}
|
|
dk(}    n:t|dzd¬«j«j «} | dk(rd}    n| dvrd}    |    rtj} nV||    t|t|«z dz«} n6|$t|dz«} | dkr!tj } ntj } tj"|| |    «Scc}w#t$rd }YŒ$wxYw#t$rtj } YŒIwxYw)aReturn battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    có–•—|D]"}t|‰¬«}|‰k7sŒ    t|«cSy#t$r|j«cYcSwxYw)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        r0N)rrÏrrÍ)r9rrr:Únulls   €rCÚ
multi_bcatz#sensors_battery.<locals>.multi_bcat¯sWø€ðò    'ˆDܐt dÔ+ˆCؐd‹{ð'ܘs›8’Oð        'ðøô"ò'ØŸ9™9›;Ô&ð'ús›
*ªAÁAÚBATÚbatteryNz /energy_nowz /charge_nowz
/power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@rÄz    /capacityr`r0z
AC0/onlinez    AC/onlinerú/statusr–Ú dischargingF>ÚfullÚchargingTié<r)Úobjectr–rbÚPOWER_SUPPLY_PATHrÎrrrrçrÑÚZeroDivisionErrorrÏrrÍrÚPOWER_TIME_UNLIMITEDÚabsÚPOWER_TIME_UNKNOWNÚsbattery)rDrKÚbatsrìÚ
energy_nowÚ    power_nowÚ energy_fullÚ time_to_emptyr^Ú power_pluggedÚonliner’ÚsecsleftrCs             @rCÚsensors_batteryr[¦sLø€ô ‹8€Dô ô—‘Ô-Ó.ö à Ø <‰<˜Ô  )¨q¯w©w«yÑ"8ò    
ð €Dð ñ
Øô 7‰7<‰<Ô)¬3¨t«9Ó 5€Dñ˜D =Ñ0°$¸Ñ2FÓG€JÙ˜4 ,Ñ.°°~Ñ0EÓF€IÙ˜T NÑ2°D¸>Ñ4IÓJ€KÙ˜tÐ&:Ñ:Ó;€MðР:Ð#9ð    Ø˜jÑ(¨;Ñ6‰Gô”c˜$ Ñ,°rÔ:Ó;ˆØ bŠ=Øð
€MÙ Ü
‰ ‰ Ô&¨ Ó5Ü
‰ ‰ Ô&¨ Ó4ó€FðÐØ !™ ‰ äT˜IÑ%°Ô3×9Ñ9Ó;×AÑAÓCˆØ ]Ò "Ø!‰MØ Ð+Ñ +Ø ˆMñ Ü×/Ñ/‰Ø    Р    IÐ$9ð    2ܘ:¬¨I«Ñ6¸Ñ=Ó>‰Hð
Р   "ܐ} rÑ)Ó*ˆØ aŠ<Ü×1Ñ1‰Hä×-Ñ-ˆä × Ñ ˜G X¨}Ó =Ð=ùòC øô.!ò    Ø‹Gð    ûôB!ò    2Ü×1Ñ1ŠHð    2ús)¬,HÃHÆHÈ HÈHÈH3È2H3có¬—g}tj«}|D]8}|\}}}}}tj||xsd|||«}|j    |«Œ:|S)z:Return currently connected users as a list of namedtuples.N)rÈÚusersrÚsuserr¼)    rÚrawlistÚitemr‹ÚttyÚhostnameÚtstamprhÚnts             rCr]r]sa€à€GÜ×ÑÓ €GØòˆØ+/Ñ(ˆˆc8˜V SÜ ]‰]˜4 ¢¨¨h¸ÀÓ DˆØ‰rÕðð €NrBcó—t«›d}t|«5}|D]H}|jd«sŒt|j    «j «d«ccddd«Sd|›}t |«‚#1swYyxYw)zAReturn the system boot time expressed in seconds since the epoch.r®sbtimerNzline 'btime' not found in )rrrÎrürÍr˜r‰)rrr¾rÙrìs    rCÚ    boot_timerfs‰€äÓÐ   Ð &€DÜ    TÓ    ð ˜aØò    6ˆD؏‰˜xÕ(ܘTŸZ™Z›\×/Ñ/Ó1°!Ñ4Ó5Ñ5÷ ñ ð    6ð+¨4¨&Ð1ˆÜ˜3ÓÐ÷  ð ús™A7±+A7Á&A7Á7BcóÀ—t«jt«}tj|«Dcgc]}|j «sŒt |«‘Œ c}Scc}w)z7Returns a list of PIDs currently running on the system.)rrvr
r–rbrýrÏ)rrrKs  rCrnrn s>€ä Ó × #Ñ #¤HÓ -€DÜŸJ™J tÓ,Ö <q°·    ±    µ ŒCFÒ <Ð<ùÒ <s µAÁ Acój—tj|«sy    t«›d|›d}t|«5}|D]?}|j    d«sŒt |j «d«}||k(ccddd«Sd|›}t|«‚#1swYyxYw#ttf$r|t«vcYSwxYw)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fr¦rGsTgid:rNz'Tgid' line not found in )
rÚ
pid_existsrrrÎrÏr˜rrÌrn)rhrrr¾rÙÚtgidrìs      rCriri&sʀô × Ñ ˜sÔ #Øð    !ô&Ó'Ð(¨¨#¨¨gÐ6ˆDܘTÓ"ð & aØò+DØ—‘ xÕ0Ü" 4§:¡:£<°¡?Ó3˜ð $ s™{Ñ*÷  &ñ &ð+ð 2°$°Ð8Ü  “oÐ%÷ &ð &ûôœÐ$ò    !Øœ$›&=Ò  ð    !ús:˜B³BÁ "BÁ-    BÁ7BÂB BÂBÂB2Â1B2cóx—i}t«}t«D]g}    t|›d|›d«5}|j«}ddd«j    d«}||dzdj «}t |d«}|||<Œi|S#1swYŒGxYw#ttf$rYŒ‰t$r}t|«|‚d}~wwxYw)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    r¦r®Nó)r<r) rrnrrrªr˜rÏrcrdrpr)    r:r½rhr¾rÚrparÚdsetÚppidr×s             rCÚppid_maprpGsрð €CÜ!Ó#€KÜ‹vò ˆð     Ü  ˜}¨A¨c¨U°%Ð8Ó9ð  ¸QØ—v‘v“x÷  ð—:‘:˜dÓ#ˆDؘ˜q™˜
Ð#×)Ñ)Ó+ˆDܐt˜A‘w“<ˆD؈CŠHð ð €J÷  ð  ûä!Ô#5Ð6ò    Ù Üò    -ܘsÓ#¨Ð ,ûð    -ús3›B¬B½BÂB     ÂBÂB9 B9Â( B4Â4B9cóB‡—tj‰«ˆfd„«}|S)zlDecorator which translates bare OSError and OSError exceptions
    into NoSuchProcess and AccessDenied.
    cóŽ•—|j|j}}    ‰|g|¢­i|¤ŽS#t$r}t||«|‚d}~wt$r"}|j «t ||«|‚d}~wt$rR}|j «tjj|j›d|›d«s t ||«|‚‚d}~wwxYw)Nr¦r®) rhÚ_namerprrdÚ_raise_if_zombierrcr–rrrˆrZ)r[rËÚkwargsrhrªr×Úfuns      €rCÚwrapperz wrap_exceptions.<locals>.wrapperbs¾ø€à—H‘H˜dŸj™jˆTˆð    ÙtÐ-˜dÒ- fÑ-Ð -øÜò    3ܘs DÓ)¨sÐ 2ûÜ!ò    4Ø × !Ñ !Ô #Ü  TÓ*°Ð 3ûÜ ò    Ø × !Ñ !Ô #ô—7‘7—>‘> T×%6Ñ%6Ð$7°q¸¸¸UÐ"CÔDÜ# C¨Ó.°CÐ7Ø ûð    ús+› '§    C° =½ CÁ    A&Á& CÁ2A B?Â?C)Ú    functoolsÚwraps)rvrws` rCÚwrap_exceptionsrz]s'ø€ô
‡__SÓóóðð$ €NrBcóL—eZdZdZgd¢Zd„Zd„Zd„Zd„Ze    fd„Z
e e d„««Z e e d    „««Ze e d
„««Zd „Zd „Ze d „«Ze d„«Ze d„«Ze d„«Ze d„«Zej0j3dej4«›d«re d„«Ze d„«Ze d„«Ze d;d„«Ze d<d„«Ze d„«Z e!se"rHd„Z#e e$jJd«e$jJd«e$jJd«fd„«Z&e d „«Z'ne Z'e"re d!„«Z(e d"„«Z)e e$jJd#«fd$„«Z*e e$jJd%«fd&„«Z+e d'„«Z,e d(„«Z-e d)„«Z.e/r%e d*„«Z0e$jJd+«fd,„Z1e d-„«Z2e3re d.„«Z4e d/„«Z5e6e7d0«r    e d;d1„«Z8e d2„«Z9e d3„«Z:e d=d4„«Z;e d5„«Z<e d6„«Z=e e$jJd7«fd8„«Z>e e$jJd9«fd:„«Z?y)>ÚProcesszLinux process implementation.)Ú_cacheÚ_ctimersÚ_ppidrZrhcóZ—||_d|_d|_d|_t    «|_yrm)rhrsrr~rrZ)r[rhs  rCr\zProcess.__init__„s)€ØˆŒØˆŒ
؈Œ
؈Œ Ü+Ó-ˆÕrBc󮗠   t|j›d|j›d«}|jd«}||dz|dz}|dk(S#t$rYywxYw)Nr¦r®rlr<r=óZF)rrZrhrªrÌ)r[rrmr’s    rCÚ
_is_zombiezProcess._is_zombie‹sk€ð    "ܘ4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð>Ó?ˆDð—:‘:˜dÓ#ˆDؘ$ ™( T¨A¡XÐ.ˆFؘT‘>Ð !øô ò    Ùð    ús‚%AÁ    AÁAcóz—|j«r+t|j|j|j«‚yrm)rƒrrhrsr©r[s rCrtzProcess._raise_if_zombie›s,€Ø ?‰?Ô Ü §¡¨$¯*©*°d·j±jÓAÐ Að rBcó`—tj|j›d|j›«y)z+Raise NSP if the process disappeared on us.r¦N)r–rèrZrhr…s rCÚ_raise_if_not_alivezProcess._raise_if_not_aliveŸs&€ô     ‰4×$Ñ$Ð% Q t§x¡x jÐ1Õ2rBcóꗠ   t|«S#ttf$rVtjj |j ›d|j›«r|j«|tur|cYS‚wxYwrø)
r—rcrdr–rrÚlexistsrZrhrtÚUNSET)r[rrrÓs   rCÚ    _readlinkzProcess._readlink¥sh€ð    Ü˜D“>Ð !øÜ!Ô#5Ð6ò    Üw‰w‰ $×"3Ñ"3Ð!4°A°d·h±h°ZÐ@ÔAØ×%Ñ%Ô'ؤ5Ñ(Ø#’OØ ð     ús‚
A!A2Á0A2có¼—t|j›d|j›d«}|jd«}||j    d«dz|}||dzdj «}i}||d<|d    |d
<|d|d <|d |d <|d|d<|d|d<|d|d<|d|d<|d|d<|d|d<    |d|d<|S#t $rtd«d    |d<Y|SwxYw)aYParse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        r¦r®rló(rr<Nrªrr’rorðÚttynré Úutimeé Ústimeé Úchildren_utimerÚÚchildren_stimeéÚ create_timeé$Úcpu_numé'Ú blkio_ticksz&can't get blkio_ticks, set iowait to 0)rrZrhrªr    r˜Ú
IndexErrorr)r[rrmrªrÀr:s      rCÚ_parse_stat_filezProcess._parse_stat_fileµs3€ôt×(Ñ(Ð)¨¨4¯8©8¨*°EÐ:Ó;ˆðz‰z˜$ӈؐD—I‘I˜d“O aÑ'¨$Ð/ˆØd˜Q‘hjÐ!×'Ñ'Ó)ˆàˆØˆˆF‰ ؘq™    ˆˆH‰ ؘQ‘iˆˆF‰ ؘa‘yˆˆG‰ ؘb‘zˆˆG‰ ؘb‘zˆˆG‰ Ø & r¡
ˆÐ ÑØ & r¡
ˆÐ ÑØ# B™ZˆˆMÑØ ™ˆˆI‰ð    #Ø!'¨¡ˆC Ñ ð ˆ
øô ò    #ä Ð:Ô ;Ø!"ˆC Ò àˆ
ð     #úsÂ4B>Â>CÃCcó˜—t|j›d|j›d«5}|j«cddd«S#1swYyxYw)zRead /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        r¦rGN)rrZrhr©r[r¾s  rCÚ_read_status_filezProcess._read_status_fileÜsD€ô˜D×-Ñ-Ð.¨a°·±¨z¸ÐAÓ Bð    ÀaØ—6‘6“8÷    ÷    ò    ús ¦AÁA    có´—t|j›d|j›d«5}|j«j    «cddd«S#1swYyxYw)Nr¦r2)rrZrhrrÍrŸs  rCÚ_read_smaps_filezProcess._read_smaps_fileæsK€ô˜D×-Ñ-Ð.¨a°·±¨z¸Ð@Ó Að    $ÀQØ—6‘6“8—>‘>Ó#÷    $÷    $ò    $ús ¦AÁAcó¦—|jj|«|jj|«|jj|«yrm)rÚcache_activater r¢r…s rCÚ oneshot_enterzProcess.oneshot_enterìs>€Ø ×Ñ×,Ñ,¨TÔ2Ø ×Ñ×-Ñ-¨dÔ3Ø ×Ñ×,Ñ,¨TÕ2rBcó¦—|jj|«|jj|«|jj|«yrm)rÚcache_deactivater r¢r…s rCÚ oneshot_exitzProcess.oneshot_exitñs>€Ø ×Ñ×.Ñ.¨tÔ4Ø ×Ñ×/Ñ/°Ô5Ø ×Ñ×.Ñ.¨tÕ4rBcó:—t|j«d«S)Nrª)rrr…s rCrªz Process.nameös€ôd×+Ñ+Ó-¨fÑ5Ó6Ð6rBcó\—|j|j›d|j›dd¬«S)Nr¦z/exer–r0©r‹rZrhr…s rCÚexez Process.exeûó5€à~‰~Ø× Ñ Ð!  4§8¡8 *¨DÐ 1¸Bðó
ð    
rBcóŠ—t|j›d|j›d«5}|j«}ddd«s|j    «gS|j d«rdnd}|j |«r|dd}|j |«}|dk(r#t|«dk(rd|vr|j d«}|S#1swYŒƒxYw)Nr¦z/cmdliner‘r†r`r)rrZrhrrtr™r˜r»)r[r¾rÚsepÚcmdlines     rCr°zProcess.cmdlines¼€ä ˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@Ó Að    ÀQØ—6‘6“8ˆD÷    áà × !Ñ !Ô #؈I🠙  fÔ-‰f°3ˆØ =‰=˜Ô ؘ˜9ˆDØ—*‘*˜S“/ˆð &Š=œS ›\¨QÒ.°3¸$±;Ø—j‘j “oˆG؈÷-    ð    ús ¦B9Â9CcóÀ—t|j›d|j›d«5}|j«}ddd«t    |«S#1swYt    «SxYw)Nr¦z/environ)rrZrhrr)r[r¾rs   rCÚenvironzProcess.environsU€ä ˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@Ó Að    ÀQØ—6‘6“8ˆD÷    ä" 4Ó(Ð(÷    ä" 4Ó(Ð(ús ¦A
AcóŒ—t|j«d«}tj«}    ||S#t$rYywxYw)NrŽ)rÏrrÚget_terminal_maprÊ)r[Útty_nrrYs   rCÚterminalzProcess.terminal!sI€äT×*Ñ*Ó,¨WÑ5Ó6ˆÜ×(Ñ(Ó*ˆð    Ø˜‘<Ð øÜò    Ùð    ús²7·    AÁAr1ú/ioc    óê—|j›d|j›d}i}t|«5}|D]8}|j«}|sŒ    |j    d«\}}t |«||<Œ:    ddd«|s|›d}t|«‚    t|d|d|d|d|d    |d
«S#t $rYŒ„wxYw#1swYŒMxYw#t$r(}|jd ›d |›d |›}t |«d‚d}~wwxYw)Nr¦r·s: z file was emptyssyscrssyscws
read_bytess write_bytessrcharswcharrz field was not found in z; found fields are ) rZrhrrÍr˜rÏrr‰r‡rÊrË)    r[ÚfnamerÀr¾rÙrªrrìr×s             rCÚ io_counterszProcess.io_counters-s@€à×(Ñ(Ð)¨¨4¯8©8¨*°CÐ8ˆE؈FܘUÓ#ð 6 qØò
6DàŸ:™:›<DÚð6Ø*.¯*©*°UÓ*;™K˜D %ô
,/¨u«:˜F 4šLñ
6÷ 6ñؘ˜Ð/Ü" 3Ó'Ð'ð 0ÜØ˜8Ñ$ؘ8Ñ$ؘ=Ñ)ؘ>Ñ*ؘ8Ñ$ؘ8Ñ$ó ðøô *ò%á$ð%ú÷ 6ð 6ûô0ò 0à—x‘x ‘{oÐ%=¸e¸WðE#Ø#) *ð.ðô! “o¨4Ð/ûð  0úsGªB5ÁB&ÁB5Â!CÂ&    B2Â/B5Â1B2Â2B5Â5B>à   C2Ã
#C-Ã-C2có—|j«}t|d«tz }t|d«tz }t|d«tz }t|d«tz }t|d«tz }t|||||«S)Nrr’r”r•r›)rrürýrŠ)r[r¿rr’r”r•rs       rCrþzProcess.cpu_timesPs‡€à×&Ñ&Ó(ˆÜf˜W‘oÓ&¬Ñ4ˆÜf˜W‘oÓ&¬Ñ4ˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜv˜mÑ,Ó-´ Ñ;ˆÜ˜  ~°~ÀvÓNÐNrBcó:—t|j«d«S)zWhat CPU the process is on.r™©rÏrr…s rCr™zProcess.cpu_numZs€ô4×(Ñ(Ó*¨9Ñ5Ó6Ð6rBNcóX—tj|j||j«Srm)rÚwait_pidrhrs)r[Útimeouts  rCÚwaitz Process.wait_s€ä× Ñ  §¡¨7°D·J±JÓ?Ð?rBcó´—|j€(t|j«d«tz |_|r |jS|jt    «zS)Nr—)r~rürrýrf)r[Ú    monotonics  rCr—zProcess.create_timecsR€ð ;‰;Ð äd×+Ñ+Ó-¨mÑ<Ó=Ä ÑKð ŒKñ Ø—;‘;Ð ð{‰{œY›[Ñ(Ð(rBc    óø—t|j›d|j›d«5}d„|j«j    «ddD«\}}}}}}}ddd«t «S#1swYŒxYw)Nr¦z/statmc3ó@K—|]}t|«tz–—Œy­wrm)rÏrÐ)Ú.0rKs  rCú    <genexpr>z&Process.memory_info.<locals>.<genexpr>‚sèø€ò8Ø&'”A“œÕ!ñ8ùs‚r•)rrZrhrºr˜rw)    r[r¾Úvmsr}reÚtextÚlibrÚdirtys             rCÚ memory_infozProcess.memory_infotsˆ€ô˜D×-Ñ-Ð.¨a°·±¨z¸Ð@Ó Að    ÀQñ8Ø+,¯:©:«<×+=Ñ+=Ó+?ÀÀÐ+Cô8Ñ 4ˆCf˜d C¨¨u÷    ôC˜˜f d¨C°°uÓ=Ð=÷        ð    ús ¦1A0Á0A9cóÈ—dx}x}}t|j›d|j›d«5}|D]˜}|jd«r#|t    |j «d«dzz }Œ7|jd«r t    |j «d«dz}Œh|jd«sŒzt    |j «d«dz}Œš    ddd«|||fS#1swYŒxYw)    Nrr¦r3sPrivate_rrßóPss:óSwap:)rrZrhrÎrÏr˜)r[ryrzr{r¾rÙs      rCÚ_parse_smaps_rollupzProcess._parse_smaps_rollup‰sà€ð !Ð  ˆCÐ  #˜ÜØ×$Ñ$Ð% Q t§x¡x j° Ð>óð
;àØò;DØ—‘ {Ô3àœs 4§:¡:£<°¡?Ó3°dÑ:Ñ:™ØŸ™¨Ô1Ü! $§*¡*£,¨q¡/Ó2°TÑ9™ØŸ™¨Õ2Ü" 4§:¡:£<°¡?Ó3°dÑ:™ñ;÷
;ð˜˜dÐ#Ð #÷
;ús¬A<CÂ)!CÃC!s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)có.—|j«}ttt|j    |«««dz}ttt|j    |«««dz}ttt|j    |«««dz}|||fS)Nrß)r¢rr¬rÏÚfindall)r[Ú _private_reÚ_pss_reÚ_swap_reÚ
smaps_dataryrzr{s        rCÚ _parse_smapszProcess._parse_smaps s‚€ð*×.Ñ.Ó0ˆJô”cœ#˜{×2Ñ2°:Ó>Ó?Ó@À4ÑGˆCÜ”cœ#˜wŸ™¨zÓ:Ó;Ó<¸tÑCˆCÜ”sœ3 × 0Ñ 0°Ó <Ó=Ó>ÀÑEˆDؘ˜dÐ#Ð #rBcóð—tr    |j«\}}}n|j    «\}}}|j «}t ||||fzŽS#ttf$r|j    «\}}}YŒCwxYwrm)ÚHAS_PROC_SMAPS_ROLLUPrÐrdrcr×rÌrx)r[ryrzr{Ú    basic_mems     rCÚmemory_full_infozProcess.memory_full_info½s„€å$ð9Ø%)×%=Ñ%=Ó%?‘NC˜™dð"&×!2Ñ!2Ó!4‘S˜$Ø×(Ñ(Ó*ˆIܘY¨#¨s°DÐ)9Ñ9Ð:Ð :øô +Ô,=Ð>ò9Ø%)×%6Ñ%6Ó%8‘NC˜šdð9úsˆAÁ#A5Á4A5có`—d„}|j«}|s|j«gS|jd«}g}|jd«}|g}|||«D]5\}}|jdd«}    |\}    }
} } } }|sd}n<t |«}|j «}|jd«rt|«s|dd    }t |    «t |
«||jd
d«|jd d«|jd d«|jd d«|jdd«|jdd«|jdd«|jdd«|jdd«|jdd«f }|j|«Œ8|S#t$r|dgz\}    }
} } } }YŒ1wxYw)aÔReturn process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.
 
            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c3ó‚K—i}|D]f}|jdd«}|djd«s&|j«|f–—|j|«ŒO    t    |d«dz||d<Œh|j«|f–—y#t
t f$r(|djd«rYŒ£d|›}t |«d‚wxYw­w)Nérr(rrßsVmFlags:z!don't know how to interpret line )r˜r™Úpopr¼rÏrrœrÎ)r­Ú current_blockrrÙrÀrìs      rCÚ
get_blocksz'Process.memory_maps.<locals>.get_blocksØsÕèø€ØØ!ò<DØ!ŸZ™Z¨¨aÓ0FØ! !™9×-Ñ-¨dÔ3à,×0Ñ0Ó2°DÐ9Ò9Ø%×,Ñ,¨TÕ2ð<Ü.1°&¸±)«n¸tÑ.C˜D ¨¡šOð<ð%×(Ñ(Ó*¨DÐ1Ó1øô !+¬JÐ7ò<Ø% a™y×3Ñ3°KÔ@á (Ø$EÀdÀXÐ"N˜CÜ",¨S£/°tÐ;ð <üs*‚AB?ÁBÁ.B?Â#B<Â(B?Â*B<Â<B?ó
rNrÞr–z[anon]r’r“sRss:sSize:rÎs Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s
Anonymous:rÏ) r¢rtr˜rßrrrÍr™rrÉr¼)r[rárr­rÚ
first_lineràÚheaderÚhfieldsr~ÚpermsÚ_offsetÚ_devÚ_inoderrr`s                rCÚ memory_mapszProcess.memory_mapsÎs¿€ò 2ð&×(Ñ(Ó*ˆDñØ×%Ñ%Ô'ؐ    Ø—J‘J˜uÓ%ˆE؈BØŸ™ 1›ˆJØ'˜LˆMÙ *¨5°-Ó @ó  ‘ ˜Ø Ÿ,™, t¨QÓ/ðNØ?FÑ<D˜% ¨$°¸ñØ#‘Dä! $›<DØŸ:™:›<DØ—}‘} \Ô2Ô;MØô<ð $ D S˜z˜ä˜4“Lܘ5“MØØ—H‘H˜W aÓ(Ø—H‘H˜X qÓ)Ø—H‘H˜W aÓ(Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ.°Ó2Ø—H‘HÐ.°Ó2Ø—H‘H˜^¨QÓ/Ø—H‘H˜]¨AÓ.Ø—H‘H˜X qÓ)ðð—    ‘    ˜$–ð=  ð>ˆIøô7"òNØ?FÈ"ȹ~Ñ<D˜% ¨$°»ðNúsÁ2    FÆF-Æ,F-có\—|j|j›d|j›dd¬«S)Nr¦z/cwdr–r0r«r…s rCÚcwdz Process.cwdr­rBsctxt_switches:\t(\d+)cóô—|j«}|j|«}|s(d|j›d|j›d}t    |«‚t j t|d«t|d««S)NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r¦z1/status; the kernel is probably older than 2.6.23rr)r rÒrZrhr7rÚpctxswrÏ)r[Ú    _ctxsw_rerÚctxswrìs     rCÚnum_ctx_switcheszProcess.num_ctx_switchess}€ð×%Ñ%Ó'ˆØ×!Ñ! $Ó'ˆÙðà×%Ñ%Ð& a¨¯© zð2.ð.ð ô & cÓ*Ð *܏~‰~œc %¨¡(›m¬S°°q±«]Ó;Ð;rBsThreads:\t(\d+)có\—|j«}t|j|«d«S©Nr)r rÏrÒ)r[Ú_num_threads_rers   rCÚ num_threadszProcess.num_threads,s-€ð×%Ñ%Ó'ˆÜ?×*Ñ*¨4Ó0°Ñ3Ó4Ð4rBcó°—tj|j›d|j›d«}|j    «g}d}|D]×}|j›d|j›d|›d}    t |«5}|j «j«}ddd«|jd«dzd}|jd    «}t|d
«tz }    t|d «tz }
tjt!|«|    |
«} |j#| «ŒÙ|r|j%«|S#1swYŒ¢xYw#ttf$rd}YŒwxYw) Nr¦z/taskFz/task/r®Trlr<rïrr‘)r–rbrZrhr4rrrÍrcrdr    r˜rürýrÚpthreadrÏr¼r‡) r[Ú
thread_idsrÚ
hit_enoentÚ    thread_idr¹r¾Ústr¿rr’rs             rCÚthreadszProcess.threads2sI€ä—Z‘Z 4×#4Ñ#4Ð"5°Q°t·x±x°jÀРFÓGˆ
؏‰Ô؈؈
Ø#ò    #ˆIØ×(Ñ(Ð)¨¨4¯8©8¨*°F¸9¸+ÀUÐKˆEð Ü  Ó'ð*¨1ØŸ™›Ÿ™Ó)B÷*ðB—G‘G˜D“M AÑ%Ð'Ð(ˆBØ—X‘X˜d“^ˆFܘ& ™*Ó%¬ Ñ3ˆEܘ& ™*Ó%¬ Ñ3ˆEÜ—_‘_¤S¨£^°U¸EÓBˆFØ N‰N˜6Õ "ð!    #ñ" Ø × $Ñ $Ô &؈÷!*ð*ûä%Ô'9Ð:ò ð"
Úð     ús*Á) EÁ4D4ÂEÄ4D=    Ä9EÅEÅEcó@—tj|j«Srm)rÈÚ getpriorityrhr…s rCÚnice_getzProcess.nice_getMs€ô×%Ñ% d§h¡hÓ/Ð/rBcóB—tj|j|«Srm)rÈÚ setpriorityrh)r[rs  rCÚnice_setzProcess.nice_setVs€ä×%Ñ% d§h¡h°Ó6Ð6rBcó@—tj|j«Srm)ròr5rhr…s rCÚcpu_affinity_getzProcess.cpu_affinity_get]s€ä×-Ñ-¨d¯h©hÓ7Ð 7rBsCpus_allowed_list:\t(\d+)-(\d+)c    óþ—|j«}|j|«}|r6ttt    |dd«t    |dd«dz««Sttt t ««««S)Nrr)r rÒraÚrangerÏr»r)r[Ú_rerr s    rCÚ_get_eligible_cpuszProcess._get_eligible_cpusask€ð×)Ñ)Ó+ˆDØ—K‘K Ó%ˆEÙÜœE¤# e¨A¡h¨q¡kÓ"2´C¸¸a¹À¹ Ó4DÀqÑ4HÓIÓJÐJäœE¤#¤m£oÓ"6Ó7Ó8Ð8rBc    ó¨—    tj|j|«y#ttf$rŸ}t |t«s|j t jk(rl|j«}tttt««««}|D]2}||vrd|›d|›}t    |«d‚||vsŒ d|›d|›}t    |«|‚‚d}~wwxYw)Nz invalid CPU z; choose between z CPU number z! is not eligible; choose between ) ròÚproc_cpu_affinity_setrhrÌrr”rerfrÚtuplerr»r)r[rr×Ú eligible_cpusÚall_cpusÚcpurìs       rCÚcpu_affinity_setzProcess.cpu_affinity_setlsä€ð Ü×*Ñ*¨4¯8©8°TÕ:øÜœZÐ(ò ܘc¤:Ô.°#·)±)¼u¿|¹|Ò2KØ$(×$;Ñ$;Ó$=MÜ$¤U¬3¬}«Ó+?Ó%@ÓAHØ#ò ;˜Ø hÑ.à".¨s¨gð6$Ø$1Ð#4ð!6ð ô#-¨S£/°tÐ;Ø mÒ3à"-¨c¨Uð3,Ø,9¨?ð!<ð ô#-¨S£/°sÐ:ð ;ðûð# ús‚ #£C²BC Â6C à Ccóˆ—tj|j«\}}t|«}t    j
||«Srm)ròr4rhr;rÚpionice)r[Úioclassrs   rCÚ
ionice_getzProcess.ionice_get†s5€ä!×1Ñ1°$·(±(Ó;‰NˆGUÜ  Ó)ˆGÜ—?‘? 7¨EÓ2Ð 2rBcóâ—|€d}|r2|tjtjhvr|›d}t|«‚|dks|dkDr d}t|«‚t    j
|j ||«S)Nrz ioclass accepts no valuer•zvalue not in 0-7 range)r;r#r rròÚproc_ioprio_setrh)r[rrrìs    rCÚ
ionice_setzProcess.ionice_setŒs{€àˆ}ؐ٘Ü×,Ñ,Ü×,Ñ,ð%ñð!˜ Ð#<Ð=Ü  “oÐ%ؐqŠy˜E AšIØ.Ü  “oÐ%Ü×'Ñ'¨¯©°'¸5ÓAÐ ArBr/có~—|jdk(r d}t|«‚    |€ tj|j|«St    |«dk7rd|›}t|«‚tj|j||«y#t
$r3}|j t jk(r|j«‚d}~wwxYw)Nrz)can't use prlimit() against PID 0 processr<z2second argument must be a (soft, hard) tuple, got )    rhrÚresourcer/r»rÌreÚENOSYSrt)r[Ú    resource_Úlimitsrìr×s     rCÚrlimitzProcess.rlimits´€ð
x‰x˜1Š}ØAÜ  “oÐ%ð Ø>ä#×+Ñ+¨D¯H©H°iÓ@Ð@ô˜6“{ aÒ'ð*Ø*0¨ð5ðô)¨›oÐ-Ü×$Ñ$ T§X¡X¨y¸&ÕAøÜò Ø—9‘9¤§ ¡ Ò,ð×)Ñ)Ô+Øûð  úsž!BÁ?B    B<    .B7Â7B<cót—|j«d}|j«}tj|d«S)Nr’ú?)rrÚ PROC_STATUSESrÉ)r[Úletters  rCr’zProcess.status¹s3€à×&Ñ&Ó(¨Ñ2ˆØ—‘“ˆä× Ñ  ¨Ó-Ð-rBcóð—g}tj|j›d|j›d«}d}|D]}|j›d|j›d|›}    t    |«}|j d«sŒ@t |«sŒL|j›d|j›d|›}    t|«5}t|j«j«d«}t|j«j«dd«}    ddd«t    «}
t|t|«t«|
|    «} |j| «Œ|r|j+«|S#1swYŒ]xYw#ttf$rd}YŒHwxYw#ttf$rd}YŒ`t $rW} | j"t"j$k(rYd} ~ Œ‹| j"t"j&k(rt)| «Yd} ~ Œ¹‚d} ~ wwxYw)    Nr¦r^Fr_z/fdinfo/rr³T)r–rbrZrhr—rÎrrrÏrºr˜r¤rqr¼rcrdrÌrerfrgrr‡) r[rrírùrsrŒrrr¾Úposrvrurr×s              rCÚ
open_fileszProcess.open_filesÀsÑ€àˆÜ—
‘
˜d×/Ñ/Ð0°°$·(±(°¸3Ð?Ó@ˆØˆ
Øó&    /ˆBØ×'Ñ'Ð(¨¨$¯(©(¨°4¸°tÐ<ˆDð$ /Ü “~ð&—?‘? 3Õ'¬M¸$Õ,?à"×/Ñ/Ð0°°$·(±(°¸8ÀBÀ4ÐHDð /Ü(¨Ó.ðD°!Ü"% a§j¡j£l×&8Ñ&8Ó&:¸1Ñ&=Ó">˜CÜ$'¨¯
©
« ×(:Ñ(:Ó(<¸QÑ(?ÀÓ$C˜E÷Dô 2°%Ó8˜Ü!*Ø ¤# b£'¬3¨s«8°T¸5ó"˜ð Ÿ™ vÖ.ðM&    /ñN Ø × $Ñ $Ô &؈÷DðDûô.Ô/AÐBò*ð&*›
ð*ûô3&Ô'9Ð:ò à!
ÚÜò Ø—9‘9¤§ ¡ Ò,娗9‘9¤× 2Ñ 2Ò2ä˜#”JÝØûð úsUÁ FÂ! E*Â,AEÄE*ÅE'    Å#E*Å*E?Å>E?ÆG5ÆG5ÆG0Ç(G0Ç/G0Ç0G5cóf—tj||j«}|j«|Srm)r¦r¢rhr‡)r[ržr:s   rCr§zProcess.net_connectionsðs)€ä×'Ñ'¨¨d¯h©hÓ7ˆØ × Ñ Ô"؈
rBcór—ttj|j›d|j›d««S)Nr¦r^)r»r–rbrZrhr…s rCÚnum_fdszProcess.num_fdsös.€ä”2—:‘: ×!2Ñ!2Р3°1°T·X±X°J¸cÐBÓCÓDÐDrBcó:—t|j«d«S)Nror½r…s rCroz Process.ppidús€ä4×(Ñ(Ó*¨6Ñ2Ó3Ð3rBsUid:\t(\d+)\t(\d+)\t(\d+)có¶—|j«}|j|«d\}}}tjt    |«t    |«t    |««Sró)r rÒrÚpuidsrÏ)r[Ú_uids_rerÚrealÚ    effectiveÚsaveds      rCÚuidsz Process.uidsþóK€à×%Ñ%Ó'ˆØ!)×!1Ñ!1°$Ó!7¸Ñ!:шˆi˜Ü}‰}œS ›Y¬¨I«¼¸E»
ÓCÐCrBsGid:\t(\d+)\t(\d+)\t(\d+)có¶—|j«}|j|«d\}}}tjt    |«t    |«t    |««Sró)r rÒrÚpgidsrÏ)r[Ú_gids_rerr+r,r-s      rCÚgidsz Process.gids    r/rBrm©F©rP)@r>r?r@r£r
r\rƒrtr‡rŠr‹rzrrr r¢r¥r¨rªr¬r°r²r¶r–rrrˆÚgetpidrºrþr™rÁr—rÌrÙÚHAS_PROC_SMAPSrÐr    r
r×rÛrêrìrñrõrürÿrÚHAS_CPU_AFFINITYrrrÚHAS_PROC_IO_PRIORITYrrÚhasattrrrr’r#r§r&ror.r3rArBrCr|r|xsâ„Ù'ò€Iò.ò"ò Bò3ð (-óð Øñ#óóð#ðJØñóóððØñ$óóð$ò3ò
5ð
ñ7óð7ðñ
óð
ð
ñóðð2ñ)óð)ð
ñóðð
‡ww‡~~˜˜y˜rŸy™y›{˜m¨3Ð/Ô0à    ñ     0ó
ð     0ðDñOóðOðñ7óð7ðò@óð@ðò)óð)ð ñ>óð>ñ$¡ò    $ð.
ð#˜Ÿ
™
Ð#;Ó<ؐB—J‘JÐ2Ó3ؐR—Z‘ZР4Ó5ò     $ó
ð    $ð8
ñ        ;ó
ñ        ;ð'Ðáà    ñE    ó
ðE    ðNñ
óð
ð
à"˜Ÿ
™
Ð#<Ó=ò <óð <ðØ*4¨"¯*©*Ð5HÓ*Iò5óð5ð
ñóðð4ñ0óð0ðñ7óð7ñà    ñ    8ó
ð    8ð!b—j‘jÐ!DÓEó        9ð
ñ    ó
ð    ñ.à    ñ    3ó
ð    3ð
 
ñ     Bó
ð     Bñˆx˜Ô#à    ò    ó
ð    ð6ñ.óð.ð ñ-óð-ð^òóðð
ñEóðEðñ4óð4ðØ&˜BŸJ™JÐ'DÓEòDóðDð
Ø&˜BŸJ™JÐ'DÓEòDóñDrBr|r5r4)•r£ryr+Úenumrerxrr–r    rrSr{Úsysrèrrr–rrrròr    rÈr
r r r rrrrrrrrrrrrrrrrrÚ__extra__all__r:r,ÚdirrÎÚisupperrMrrrˆr6r7rÙr9r8rrýÚ getpagesizerÐÚ    byteorderrwrLrŠrïÚIntEnumrÏÚ    AF_PACKETr8r9r;ÚglobalsroÚ __members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚ STATUS_ZOMBIEÚ STATUS_DEADÚSTATUS_WAKE_KILLÚ STATUS_WAKINGÚ STATUS_IDLEÚ STATUS_PARKEDrr$r%r&r'r(r)r*r+r,r-r.rŠr[rgrqrwrûrxr|rçr…r‡rŠr—r¤r¬rÂÚ    Exceptionr×r¹rÜrírùrþrrrr&r)rAÚ net_if_addrsrDrFr¦r§rÀrÕÚ
disk_usageròrôrr=r@r[r]rfrnrirprzr|r-s0rCú<module>rTsóðñ
%óÛÛ Û ÛÛ Û    Û    ÛÛ Û Û
ÛÝ#Ý"åÝÝ#Ý)ÝÝ$Ý$Ý'Ý!Ý"Ý"ÝÝÝÝÝ$Ý"ÝÝ+Ý ÝÝ(Ý'Ý"Ý"ò    €ñ ˆ8YÔØ×ÑÙ˜“IÖFˆq §¡¨fÕ!5¸!¿)¹)½+ŠÒFôð.ÐØ—‘—‘ &¨¨¯©«¨ °VР<Ó=€ØŸ™Ÿ™¨°    °·    ±    ³ ¨}¸MÐ'JÓKÐÙ˜tÐ%6Ó7ÐÙ˜4Ð!8Ó9Ððˆbj‰j˜Ó&€ Ø !ˆ:× !Ñ !Ó #€Ø— ‘  Ñ)€ Ù‹€ðÐà— ‘ ؐi¡ V×%5Ñ%5Ó!6Ð7ó€ ð ×
€ô—‘ôñƒ    ×ѐ×'Ñ'Ô(ð
×    Ñ    Ø    ×     Ñ     Ø    ×    "Ñ    "Ø    ×    Ñ    Ø    ×    $Ñ    $Ø    ×    Ñ    Ø    ×    Ñ    Ø    ×    Ñ    Ø    ×    !Ñ    !Ø    ×    Ñ    Ø    ×    Ñ    Ø    ×    Ñ    ñ € ð" ×
 Ñ
 Ø
 Ñ
 Ø
 Ñ
 Ø
ñ € ñ,    Ø òKó    L€ñ Ø òó €ñ ØÒ<ó >€    ñ&Ð>Ó?€á j $§,¡,Ð1GÑ"GÓ H€áØòJóK€ ñ
ؐ §¡¨-×*?Ñ*?Ó!@Ñ@ó B€    ñò6ó7€ñ {ò"ó #€    òò(
ò$ð&    ñ0ó    ð0ð0KÙ˜Ô!ò<ò~~òB4@òx ò ò(ò:'òTò2
ð‡77‡>>Ð;Ô<ÀÇÁÇÁØ*ôAó#òNPð×&Ò&€ ô    ˜Iô    ÷kñkñ\"Ó#Ðó+ò
,ò^ðB×  Ò  €
óf÷RHñHóV$òXsòlò>W>ò~ò ò =ò !òBò,÷6P
DòP
Dùòq1    GøðjòKá    Ð *¨3¨'Ð
2Ô3Ø;‘
˜;Ð(:Ó;¸CÀÀcÓJ…IûðKús*Ã;R2ÄR2Ä#R2ÏR7Ò7S"Ò<SÓS"