Files
exchange_monitor_sync/utils/__pycache__/redis_client.cpython-311.pyc

188 lines
28 KiB
Plaintext
Raw Normal View History

2025-12-04 15:40:19 +08:00
<EFBFBD>
2025-12-04 22:03:02 +08:00
ג1i<31>`<00><00><><00>ddlZddlZddlZddlZddlZddlmZddlmZm Z m
Z
m Z ddl m Z ddlmZmZmZmZmZmZddlmZmZGd<06>d<07><00>ZdS)<08>N)<01>logger)<04> REDIS_CONFIG<49>COMPUTER_NAMES<45>COMPUTER_NAME_PATTERN<52> SYNC_CONFIG)<06>List<73>Dict<63>Any<6E>Set<65>Tuple<6C>Optional)<02>datetime<6D> timedeltac <00><><00><00>eZdZdZdZ<04>fd<03>Zd<04>Zed<05><00><00>Zd<06>Z de
2025-12-04 19:44:22 +08:00
e e
ffd<08>Z de e fd <09>Zd
e de
e e
ffd <0B>Zde
e e
ffd <0C>Zd e de fd<0E>Zde de de dee
fd<12>Zde
e e
fde
e e e
ffd<14>Zde
e e
fde e
fd<15>Zde de e
de e
fd<17>Zdedede de e
fd<1A>Zde
e e
fde e
fd<1B>Zde de e
de e
fd<1C>Zdedede de e
fd<1D>Zde
de e de
2025-12-04 22:03:02 +08:00
e effd <20>Zde
e e
fde e
fd!<21>Zde de e
de e
fd"<22>Zdedede de e
fd#<23>Z d$<24>Z!<21>xZ"S)%<25> RedisClientuRedis客户端管理器Nc<00><><00><01>|j<00>2t<00><00><00>|<00><00>|_d|j_|jS)NF)<04> _instance<63>super<65>__new__<5F> _initialized)<02>cls<6C> __class__s <20><>9/root/project/exchange_monitor_sync/utils/redis_client.pyrzRedisClient.__new__s4<00><><00> <0E>=<3D> <20>!<21>G<EFBFBD>G<EFBFBD>O<EFBFBD>O<EFBFBD>C<EFBFBD>0<>0<>C<EFBFBD>M<EFBFBD>).<2E>C<EFBFBD>M<EFBFBD> &<26><12>}<7D><1C>c<00><><00>|jsNd|_d|_d|_|<00><00><00>|_t jt<00><00>|_dSdS)NT) r<00>_pool<6F>_client<6E>_get_computer_names<65>computer_names<65>re<72>compiler<00>computer_name_pattern<72><01>selfs r<00>__init__zRedisClient.__init__s]<00><00><13> <20> K<01><1D>D<EFBFBD>J<EFBFBD><1F>D<EFBFBD>L<EFBFBD> $<24>D<EFBFBD> <1D>"&<26>":<3A>":<3A>"<<3C>"<<3C>D<EFBFBD> <1F>)+<2B><1A>4I<34>)J<>)J<>D<EFBFBD> &<26> &<26> &<26>  K<01> Krc<00>F<00>|j<00>|<00><00><00>|jS)u#获取Redis客户端懒加载)r<00>_init_connection_poolr#s r<00>clientzRedisClient.clients&<00><00> <10><<3C> <1F> <10> &<26> &<26> (<28> (<28> (<28><13>|<7C>rc<00><><00> tjtdtdtdtdtdd<06><07><00>|_tj|j<00><08><00>|_|j<00><00><00>tjd <09><00>d S#t$r}tj
2025-12-04 15:40:19 +08:00
d
2025-12-04 22:03:02 +08:00
|<01><00><02><00><00>d }~wwxYw) u初始化连接池<E68EA5>host<73>port<72>db<64>decode_responses<65>max_connectionsT)r*r+r,r-r.<00>socket_keepalive)<01>connection_pooluRedis连接池初始化成功uRedis连接失败: N) <0B>redis<69>ConnectionPoolrr<00>Redisr<00>pingr<00>info<66> Exception<6F>error)r$<00>es rr'z!RedisClient._init_connection_pool&s<><00><00> <12><1E>-<2D>!<21>&<26>)<29>!<21>&<26>)<29><1F><04>%<25>!-<2D>.@<40>!A<> ,<2C>-><3E> ?<3F>!%<25> <0E><0E><0E>D<EFBFBD>J<EFBFBD>!<21>;<3B>t<EFBFBD>z<EFBFBD>B<>B<>B<>D<EFBFBD>L<EFBFBD> <11>L<EFBFBD> <1D> <1D> <1F> <1F> <1F> <12>K<EFBFBD>7<> 8<> 8<> 8<> 8<> 8<><38><18> <12> <12> <12> <12>L<EFBFBD>2<>q<EFBFBD>2<>2<> 3<> 3<> 3<> <11><><EFBFBD><EFBFBD><EFBFBD> <12><><EFBFBD>s<00>B"B&<00>&
2025-12-04 19:44:22 +08:00
C <03>0C<03>C <03>returnc<00><><00> i}d}|jD]1}|<00>|<03><00>}|dz }|<01>|<04><00><00>2|s(tjd<03><00>|<00><00><00>}tjdt|j<00><00><00>dt|<01><00><00>d<06><05><00>|S#t$r#}tj d|<05><00><02><00>icYd}~Sd}~wwxYw) u/从Redis获取所有计算机名的账号配置r<00>u<配置的计算机名未找到数据,尝试自动发现...<2E>从 u 个计算机名获取到 <20>
个账号u获取账户信息失败: N)
2025-12-04 22:03:02 +08:00
r<00>_get_accounts_by_computer_name<6D>updater<00>warning<6E>_discover_all_accountsr5<00>lenr6r7)r$<00> accounts_dict<63>total_keys_processed<65> computer_name<6D>accountsr8s r<00>get_accounts_from_redisz#RedisClient.get_accounts_from_redis;s <00><00> <16><1E>M<EFBFBD>#$<24> <20>"&<26>!4<> /<2F> /<2F> <0A><1F>><3E>><3E>}<7D>M<>M<><08>$<24><01>)<29>$<24><1D>$<24>$<24>X<EFBFBD>.<2E>.<2E>.<2E>.<2E>!<21> ><3E><16><0E>]<5D>^<5E>^<5E>^<5E> $<24> ;<3B> ;<3B> =<3D> =<3D> <0A> <12>K<EFBFBD>q<>s<EFBFBD>4<EFBFBD>#6<>7<>7<>q<>q<>SV<53>Wd<57>Se<53>Se<53>q<>q<>q<> r<> r<> r<> <20> <20><><18> <16> <16> <16> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>s<00>B"B%<00>%
C<03>/C <03>C<03> Cc<00><><00>dtvr7d<02>tjd<01><00>D<00><00>}tjd|<01><00><02><00>|Stj<00><00>gS)u获取计算机名列表<E58897>,c<00>6<00>g|]}|<01><00><00><00><02>S<00>)<01>strip)<02>.0<EFBFBD>names r<00>
<listcomp>z3RedisClient._get_computer_names.<locals>.<listcomp>Xs <00><00>H<>H<>H<>d<EFBFBD>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>\<5C>\<5C>H<>H<>Hru#使用配置的计算机名列表: )r<00>splitrr5rL)r$<00>namess rrzRedisClient._get_computer_namesUs[<00><00> <0E>.<2E> <20> <20>H<>H<>n<EFBFBD>.B<>3<EFBFBD>.G<>.G<>H<>H<>H<>E<EFBFBD> <12>K<EFBFBD>E<>e<EFBFBD>E<>E<> F<> F<> F<><18>L<EFBFBD><1E>$<24>&<26>&<26>'<27>'rrEc<00><00>i} |<01>d<01>}|j<00>|<03><00>}|stjd|<03>d<03><03><00>iS|<04><00><00>D]<5D>\}} t j|<06><00>}|s<01>|<00>|<05><00>}|<07><00><00>D](\} }
2025-12-04 19:44:22 +08:00
|<00>|| |
<EFBFBD><00>} | r
|| d<| || <<00>)<29>p#t
j $r$} tj
d|<05>d| <0C><00><04><00>Yd} ~ <0C><>d} ~ wt$r$} tj
d|<05>d | <0C><00><04><00>Yd} ~ <0C><>d} ~ wwxYwtj d
|<03>d t|<02><00><00>d <0C><05><00>n1#t$r$} tj
d |<01>d| <0C><00><04><00>Yd} ~ nd} ~ wwxYw|S)u!获取指定计算机名的账号<E8B4A6> _strategy_apiu
2025-12-04 22:03:02 +08:00
未找到 u 的策略API配置rEu解析交易所 u 的JSON数据失败: Nu处理交易所 <20> 数据异常: r<u 解析到 r=u获取计算机名 u 的账号失败: )r(<00>hgetallr<00>debug<75>items<6D>json<6F>loads<64>format_exchange_id<69> parse_account<6E>JSONDecodeErrorr7r6r5rB) r$rErC<00> redis_key<65>result<6C> exchange_name<6D> accounts_jsonrF<00> exchange_id<69>
account_id<EFBFBD> account_info<66>parsed_accountr8s rr>z*RedisClient._get_accounts_by_computer_name]s*<00><00><1A> <0A>& U<01>(<28>7<>7<>7<>I<EFBFBD><1A>[<5B>(<28>(<28><19>3<>3<>F<EFBFBD><19> <1A><16> <0C>H<>)<29>H<>H<>H<>I<>I<>I<><19> <09>17<31> <0C> <0C><0E><0E> <1D> <1D>,<2C> <0A>}<7D><1D>#<23>z<EFBFBD>-<2D>8<>8<>H<EFBFBD>#<23>!<21> <20>#'<27>"9<>"9<>-<2D>"H<>"H<>K<EFBFBD>4<<3C>N<EFBFBD>N<EFBFBD>4D<34>4D<34>G<01>G<01>0<>
2025-12-04 19:44:22 +08:00
<EFBFBD>L<EFBFBD>)-<2D>);<3B>);<3B>K<EFBFBD><1A>Ua<55>)b<>)b<><0E>)<29>G<01>>K<>N<EFBFBD>?<3F>;<3B>8F<38>M<EFBFBD>*<2A>5<><35> G<01><><1C>+<2B><1D><1D><1D><1A>L<EFBFBD>!\<5C>M<EFBFBD>!\<5C>!\<5C>YZ<59>!\<5C>!\<5C>]<5D>]<5D>]<5D><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD> <20><1D><1D><1D><1A>L<EFBFBD>!U<>M<EFBFBD>!U<>!U<>RS<52>!U<>!U<>V<>V<>V<><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><1D><><EFBFBD><EFBFBD> <13>K<EFBFBD>S<>y<EFBFBD>S<>S<>S<EFBFBD><1D>5G<35>5G<35>S<>S<>S<> T<> T<> T<> T<><54><18> U<01> U<01> U<01> <12>L<EFBFBD>S<>}<7D>S<>S<>PQ<50>S<>S<> T<> T<> T<> T<> T<> T<> T<> T<><54><EFBFBD><EFBFBD><EFBFBD> U<01><><EFBFBD><EFBFBD><1D>se<00>:E<00>E<00>C<02>/E<00>0AC<02>E<00>D"<05>C1<05>,E<00>1 D"<05>>D<05>E<00>D"<05>"+E<00>
E<<03>E7<03>7E<c<00><><00>i}g} d}d} |j<00>||d<04><05><00>\}}|D]C}t|t<00><00>r|<06>d<06><00>n|}|<02>|<07><00><00>D|dkrn<01>nt jdt|<02><00><00>d<08><03><00>|D]t}|<07> d d
<EFBFBD><00>}|j
<00> |<08><00>r+|<00> |<08><00>} |<01> | <09><00><00>]t jd |<08><00><02><00><00>ut jd t|<01><00><00>d <0A><03><00>n.#t$r!}
t jd|
<EFBFBD><00><02><00>Yd}
~
nd}
~
2025-12-04 22:03:02 +08:00
wwxYw|S)u$自动发现所有匹配的账号keyz*_strategy_apirT<>d)<02>match<63>count<6E>utf-8u 自动发现 u 个策略API keyrS<00>u&跳过不符合格式的计算机名: u自动发现共获取到 r=u自动发现账号失败: N)r(<00>scan<61>
isinstance<EFBFBD>bytes<65>decode<64>appendrr5rB<00>replacer"rgr>r?r@r6r7) r$rC<00>discovered_keys<79>pattern<72>cursor<6F>keys<79>key<65>key_strrErFr8s rrAz"RedisClient._discover_all_accounts<74>s<><00><00><1A> <0A><1C><0F> ;<3B>&<26>G<EFBFBD><16>F<EFBFBD> <1A>#<23>{<7B>/<2F>/<2F><06>g<EFBFBD>S<EFBFBD>/<2F>Q<>Q<> <0C><06><04><1F>4<>4<>C<EFBFBD>5?<3F><03>U<EFBFBD>5K<35>5K<35>T<>c<EFBFBD>j<EFBFBD>j<EFBFBD><17>1<>1<>1<>QT<51>G<EFBFBD>#<23>*<2A>*<2A>7<EFBFBD>3<>3<>3<>3<><19>Q<EFBFBD>;<3B>;<3B><19> <1A> <13>K<EFBFBD>O<><03>O<EFBFBD>(<<3C>(<<3C>O<>O<>O<> P<> P<> P<>+<2B> ]<01> ]<01><07> '<27><0F><0F><0F><12> D<> D<> <0A><18>-<2D>3<>3<>M<EFBFBD>B<>B<>]<01>#<23>B<>B<>=<3D>Q<>Q<>H<EFBFBD>!<21>(<28>(<28><18>2<>2<>2<>2<><1A>N<EFBFBD>#[<5B>M<EFBFBD>#[<5B>#[<5B>\<5C>\<5C>\<5C>\<5C> <12>K<EFBFBD>R<>C<EFBFBD> <0A>4F<34>4F<34>R<>R<>R<> S<> S<> S<> S<><53><18> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><1D>s<00>D4D;<00>;
E&<03>E!<03>!E&ruc<00>Z<00>|<01><00><00><00><00><00>}idd<02>dd<04>dd<04>dd<04>dd<07>dd <09>d d <09>d
2025-12-04 19:44:22 +08:00
d
<EFBFBD>d d
<EFBFBD>d d
<EFBFBD>d d <0A>dd <0A>dd<07>dd<07>dd<10>dd<10>dd<12>dddd<14><03>}|<02>||<01><00>}||kr-||<02><00><00>vrt jd|<01><00><02><00>|S)u格式化交易所ID<49>
metatrader<EFBFBD>mt5<74>binance_spot_test<73>binance<63> binance_spot<6F> gate_spot<6F>gate<74>okex<65>okx<6B>bybit<69>
bybit_spot<EFBFBD>
bybit_test<EFBFBD>huobi<62>
2025-12-04 22:03:02 +08:00
huobi_spot<EFBFBD>gateio<69>kucoin<69> kucoin_spot<6F>mexc<78>bitget)<03> mexc_spotr<74><00> bitget_spotu未映射的交易所名称: )<06>lowerrL<00>get<65>valuesrrV)r$ru<00>exchange_mapping<6E>normalized_keys rrZzRedisClient.format_exchange_id<69>s_<00><00><11>i<EFBFBD>i<EFBFBD>k<EFBFBD>k<EFBFBD><1F><1F>!<21>!<21><03>
2025-12-04 19:44:22 +08:00
<EFBFBD> <18>%<25>
<EFBFBD> <1F><19>
<EFBFBD> <1B>I<EFBFBD>
<EFBFBD> <16>y<EFBFBD> 
<EFBFBD>
<18><16> 
<EFBFBD> <13>E<EFBFBD> 
<EFBFBD> <12>5<EFBFBD>
<EFBFBD> <14>W<EFBFBD>
<EFBFBD> <19>'<27>
<EFBFBD> <19>'<27>
<EFBFBD> <14>W<EFBFBD>
<EFBFBD> <19>'<27>
<EFBFBD> <13>F<EFBFBD>
<EFBFBD> <15>f<EFBFBD>
<EFBFBD> <15>h<EFBFBD>
<EFBFBD> <1A>8<EFBFBD>!
<EFBFBD>" <13>F<EFBFBD>#
<EFBFBD>$ <20><1E>#<23>)
<EFBFBD>
<EFBFBD>
2025-12-04 22:03:02 +08:00
<EFBFBD><18>.*<2A>-<2D>-<2D>c<EFBFBD>3<EFBFBD>7<>7<><0E> <1A>S<EFBFBD> <20> <20>S<EFBFBD>0@<40>0G<30>0G<30>0I<30>0I<30>%I<>%I<> <12>L<EFBFBD>><3E><13>><3E>><3E> ?<3F> ?<3F> ?<3F><1D>rrarbrcc <00><><00> tj|<03><00>}||tj|<04>d<01><00>d<02><00>tj|<04>d<03><00>d<02><00>|<04>dd<05><00>d<06>}|S#tj$r1}t jd|<02>d|<06>d |d
2025-12-04 19:44:22 +08:00
d <0B><00>d <0C><07><00>Yd
}~d
Sd
}~wt$r%}t jd |<02>d|<06><00><04><00>Yd
}~d
Sd
2025-12-04 22:03:02 +08:00
}~wwxYw)u解析账号信息<E4BFA1>st_idr<00>add_time<6D>api_keyrj)ra<00>k_idr<64>r<>r<>u 解析账号 u JSON数据失败: u, 原始数据: Nrfz...u 处理账号 rT) rXrY<00>helpers<72>safe_intr<74>r\rr7r6)r$rarbrc<00>source_account_info<66> account_datar8s rr[zRedisClient.parse_account<6E>s1<00><00> <18>"&<26>*<2A>\<5C>":<3A>":<3A> <1F> +<2B>"<22> <20>)<29>*=<3D>*A<>*A<>'<27>*J<>*J<>A<EFBFBD>N<>N<>#<23>,<2C>-@<40>-D<>-D<>Z<EFBFBD>-P<>-P<>RS<52>T<>T<>.<2E>2<>2<>9<EFBFBD>b<EFBFBD>A<>A<> <0E><0E>L<EFBFBD> <20> <1F><><13>#<23> <18> <18> <18> <12>L<EFBFBD>r<><1A>r<>r<><01>r<>r<>[g<>hl<68>il<69>hl<68>[m<>r<>r<>r<> s<> s<> s<><17>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><18> <18> <18> <18> <12>L<EFBFBD>G<><1A>G<>G<>A<EFBFBD>G<>G<> H<> H<> H<><17>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD> <18><><EFBFBD>s$<00>A=B<00>C-<03>&B;<03>; C-<03>C(<03>(C-rFc<00><><00>i}|<01><00><00>D]@\}}|<04>d<01><00>}|r$||vrg||<||<00>|<04><00><00>A|S)u按交易所分组账号ra)rWr<>ro)r$rF<00>groupsrbrcras r<00>_group_accounts_by_exchangez'RedisClient._group_accounts_by_exchange<67>st<00><00><13><06>(0<><0E><0E>(8<>(8<> 9<> 9<> $<24>J<EFBFBD> <0C>&<26>*<2A>*<2A>=<3D>9<>9<>K<EFBFBD><1A> 9<><1E>f<EFBFBD>,<2C>,<2C>*,<2C>F<EFBFBD>;<3B>'<27><16>{<7B>#<23>*<2A>*<2A><<3C>8<>8<>8<><38><15> rc<00><00><>K<00>g} |<00>|<01><00>}g}|<03><00><00>D]0\}}|<00>||<06><00>}|<04>|<07><00><00>1t j|ddi<01><01>d{V<00><03>}|D],} t | t<00><00>r|<02>| <09><00><00>-n.#t$r!}
2025-12-04 19:44:22 +08:00
tj d|
<EFBFBD><00><02><00>Yd}
~
nd}
~
2025-12-04 22:03:02 +08:00
wwxYw|S)u!收集所有账号的持仓数据<E695B0>return_exceptionsTNu收集持仓数据失败: ) r<>rW<00>_collect_exchange_positionsro<00>asyncio<69>gatherrl<00>list<73>extendr6rr7) r$rF<00> all_positions<6E>account_groups<70>tasksra<00> account_list<73>task<73>resultsr^r8s r<00>_collect_all_positionsz"RedisClient._collect_all_positions<6E>s(<00><00><00><00><1A> <0A> ;<3B>!<21>=<3D>=<3D>h<EFBFBD>G<>G<>N<EFBFBD><17>E<EFBFBD>-;<3B>-A<>-A<>-C<>-C<> #<23> #<23>)<29> <0B>\<5C><1B>7<>7<> <0B>\<5C>R<>R<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 1<> 1<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>1<>!<21>(<28>(<28><16>0<>0<>0<><30> 1<><31><19> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><1D><1C><00>B"B)<00>)
C<03>3C<03>Cr<>c<00><00><>K<00>g} g}|D]Y}t|d<00><00>}|<05>dd<03><00>}|<00>|||<01><00>}|<04>|<08><00><00>Zt j|ddi<01><01>d{V<00><03>} | D],}
2025-12-04 19:44:22 +08:00
t |
t<00><00>r|<03>|
2025-12-04 22:03:02 +08:00
<EFBFBD><00><00>-n1#t$r$} tj d|<01>d| <0B><00><04><00>Yd} ~ nd} ~ wwxYw|S) u$收集某个交易所的持仓数据r<E68DAE>r<>rr<>TN<54>收集交易所 u 持仓数据失败: ) <0C>intr<74><00>_get_positions_from_redisror<>r<>rlr<>r<>r6rr7) r$rar<><00>positions_listr<74>rcr<>r<>r<>r<>r^r8s rr<>z'RedisClient._collect_exchange_positionss8<00><00><00><00><1B><0E> S<01><16>E<EFBFBD> ,<2C> #<23> #<23> <0C><1A><<3C><06>/<2F>0<>0<><04>$<24>(<28>(<28><17>!<21>4<>4<><05><1B>5<>5<>d<EFBFBD>E<EFBFBD>;<3B>O<>O<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 2<> 2<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>2<>"<22>)<29>)<29>&<26>1<>1<>1<><31> 2<><32><19> S<01> S<01> S<01> <12>L<EFBFBD>Q<>K<EFBFBD>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<> R<> R<> R<> R<> R<><52><EFBFBD><EFBFBD><EFBFBD> S<01><><EFBFBD><EFBFBD><1E>s<00>B$B+<00>+
C<03>5C<03>Cr<>r<>c<00><00>K<00> |<03>d|<01><00>}|j<00>|d<02><00>}|sgStj|<05><00>}|D]}||d<||d<||d<<00>|S#t$r&}t jd|<01>d|<08><00><04><00>gcYd}~Sd}~wwxYw) u从Redis获取持仓数据z :positions:<3A> positionsr<73>r<>rau$获取Redis持仓数据失败: k_id=<3D>, error=N)r(<00>hgetrXrYr6rr7) r$r<>r<>rar]<00>
redis_datar<EFBFBD><00>positionr8s rr<>z%RedisClient._get_positions_from_redis.s<><00><00><00><00> <16>&<26>9<>9<>4<EFBFBD>9<>9<>I<EFBFBD><1D><1B>)<29>)<29>)<29>[<5B>A<>A<>J<EFBFBD><1D> <1A><19> <09><1C>
2025-12-04 19:44:22 +08:00
<EFBFBD>:<3A>.<2E>.<2E>I<EFBFBD>&<26> 6<> 6<><08>#'<27><08><16> <20>$)<29><08><17>!<21>*5<><08><1D>'<27>'<27><1C> <1C><><18> <16> <16> <16> <12>L<EFBFBD>Q<><04>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>s"<00>%A<00>)A<00>
B<03>A?<03>9B<03>?Bc<00><00><>K<00>g} |<00>|<01><00>}g}|<03><00><00>D]0\}}|<00>||<06><00>}|<04>|<07><00><00>1t j|ddi<01><01>d{V<00><03>}|D],} t | t<00><00>r|<02>| <09><00><00>-tj
dt|<02><00><00>d<05><03><00>n.#t$r!}
tj d|
<EFBFBD><00><02><00>Yd}
~
nd}
~
2025-12-04 22:03:02 +08:00
wwxYw|S)u'收集所有账号的账户信息数据r<E68DAE>TNu
收集到 u 条账户信息记录u 收集账户信息数据失败: )r<>rW<00>_collect_exchange_account_dataror<>r<>rlr<>r<>rr5rBr6r7) r$rF<00>all_account_datar<61>r<>rar<>r<>r<>r^r8s r<00>_collect_all_account_dataz%RedisClient._collect_all_account_dataGsO<00><00><00><00><1D><18> A<01>!<21>=<3D>=<3D>h<EFBFBD>G<>G<>N<EFBFBD><17>E<EFBFBD>-;<3B>-A<>-A<>-C<>-C<> #<23> #<23>)<29> <0B>\<5C><1B>:<3A>:<3A>;<3B> <0C>U<>U<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 4<> 4<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>4<>$<24>+<2B>+<2B>F<EFBFBD>3<>3<>3<><33> <12>K<EFBFBD>R<>S<EFBFBD>)9<>%:<3A>%:<3A>R<>R<>R<> S<> S<> S<> S<><53><18> A<01> A<01> A<01> <12>L<EFBFBD>?<3F>A<EFBFBD>?<3F>?<3F> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40><><EFBFBD><EFBFBD><EFBFBD> A<01><><EFBFBD><EFBFBD> <20>s<00>CC<00>
2025-12-04 19:44:22 +08:00
C9<03>C4<03>4C9c<00><00><>K<00>g} |D]_}t|d<00><00>}|<04>dd<03><00>}|<00>|||<01><00><00>d{V<00><03>}|<03>|<07><00><00>`t jd|<01>dt |<03><00><00>d<07><05><00>n1#t$r$}t jd|<01>d |<08><00><04><00>Yd}~nd}~wwxYw|S)
2025-12-04 22:03:02 +08:00
u*收集某个交易所的账户信息数据r<E68DAE>r<>rN<>
交易所 <20> : 收集到 u 条账户信息r<E681AF>u 账户信息失败: ) r<>r<><00>_get_account_info_from_redisr<73>rrVrBr6r7) r$rar<><00>account_data_listrcr<>r<>r<>r8s rr<>z*RedisClient._collect_exchange_account_datads<00><00><00><00><1E><19> S<01> ,<2C> 7<> 7<> <0C><1A><<3C><06>/<2F>0<>0<><04>$<24>(<28>(<28><17>!<21>4<>4<><05>&*<2A>%F<>%F<>t<EFBFBD>U<EFBFBD>T_<54>%`<60>%`<60>`<60>`<60>`<60>`<60>`<60>`<60> <0C>!<21>(<28>(<28><1C>6<>6<>6<>6<> <12>L<EFBFBD>g<>k<EFBFBD>g<>g<>s<EFBFBD>CT<43>?U<>?U<>g<>g<>g<> h<> h<> h<> h<><68><18> S<01> S<01> S<01> <12>L<EFBFBD>Q<>K<EFBFBD>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<> R<> R<> R<> R<> R<><52><EFBFBD><EFBFBD><EFBFBD> S<01><><EFBFBD><EFBFBD>!<21> s<00>B
2025-12-04 19:44:22 +08:00
B<00>
B?<03>B:<03>:B?c
2025-12-04 22:03:02 +08:00
<00><00><>K<00> |<03>d|<01><00>}|j<00>|<04><00>}|sgStd}tj<00><00>}i}|<05><00><00>D<00>]p\} }
t j|
<EFBFBD><00>} | <0B>dd<04><00>} | <0B>dd<04><00>} | r| dvr<01>Ntj | d<07><00>}||z
j
|kr<01>r| |vr
dddd d
<EFBFBD>|| <| <0B>d <0B><00>r$t| <0B>d d <0C><00><00><00>}n#t| <0B>d d <0C><00><00><00>}| dkr||| d<d|| d<n9| dkr|| dxx|z cc<n| dkr|| dxx|z cc<<00><01>4#t j tf$r%}tjd| <09>d|<10><00><04><00>Yd}~<10><01>jd}~wwxYwg}t!|<08><00><00><00><00>}|<00>||<12><00>}|D]<5D>} || }|ds|dd kr |dd kr<01>+|d}|d}|d}|<13>| d<08><00>}||z
|z
2025-12-04 19:44:22 +08:00
|z
2025-12-04 22:03:02 +08:00
}tj | d<07><00>}t'|<0E><00><00><00><00>}|||||d||d<17>}|<11>|<1B><00><00><>|S#t,$r&}tjd|<01>d|<10><00><04><00>gcYd}~Sd}~wwxYw)u8从Redis获取账户信息数据批量优化版本z :balance:<3A> recent_days<79>lz_timerj<00>lz_type)<03>
2025-12-04 19:44:22 +08:00
lz_balance<EFBFBD>deposit<69>
2025-12-04 22:03:02 +08:00
withdrawal<EFBFBD>%Y-%m-%d<>F)<04>balancer<65>r<><00> has_balance<63> lz_amountr<00>lz_moneyr<79>r<>Tr<54>r<>r<>u解析Redis数据失败: r<>N)r<>r<>r<>r<>r<><00>other<65>profit<69>timeu$获取Redis账户信息失败: k_id=)r(rUrr<00>nowrWrXrYr<><00>strptime<6D>days<79>floatr\<00>
ValueErrorrrV<00>sortedrt<00>_get_previous_balancesr<73><00> timestampror6r7)r$r<>r<>rar]<00> redis_fundsr<73><00>today<61>
date_stats<EFBFBD>fund_key<65> fund_json<6F> fund_data<74>date_strr<72><00>date_objr<6A>r8r<><00> sorted_dates<65>prev_balance_map<61>statsr<73>r<>r<><00> prev_balancer<65><00>time_timestampr<70>s rr<>z(RedisClient._get_account_info_from_redisxs<><00><00><00><00>` <16>&<26>7<>7<><14>7<>7<>I<EFBFBD><1E>+<2B>-<2D>-<2D>i<EFBFBD>8<>8<>K<EFBFBD><1E> <1A><19> <09>&<26>m<EFBFBD>4<>K<EFBFBD><1C>L<EFBFBD>N<EFBFBD>N<EFBFBD>E<EFBFBD><1B>J<EFBFBD>(3<>'8<>'8<>':<3A>':<3A>% <1D>% <1D>#<23><08>)<29>$<1D> $<24>
2025-12-04 19:44:22 +08:00
<EFBFBD>9<EFBFBD> 5<> 5<>I<EFBFBD>(<28>}<7D>}<7D>Y<EFBFBD><02>;<3B>;<3B>H<EFBFBD>'<27>m<EFBFBD>m<EFBFBD>I<EFBFBD>r<EFBFBD>:<3A>:<3A>G<EFBFBD>#<23>!<21>w<EFBFBD>6]<5D>']<5D>']<5D> <20> (<28>0<><18>:<3A>F<>F<>H<EFBFBD><1D><08>(<28>.<2E><1B><<3C><<3C> <20><1F>z<EFBFBD>1<>1<>'*<2A>'*<2A>*-<2D>+0<> 0<1A>0<1A>
2025-12-04 22:03:02 +08:00
<EFBFBD>8<EFBFBD>,<2C> !<21>}<7D>}<7D>[<5B>1<>1<>H<01>$)<29>)<29>-<2D>-<2D> <0B>Q<EFBFBD>*G<>*G<>$H<>$H<> <09> <09>$)<29>)<29>-<2D>-<2D>
<EFBFBD>A<EFBFBD>*F<>*F<>$G<>$G<> <09><1F>,<2C>.<2E>.<2E>:C<>
2025-12-04 19:44:22 +08:00
<EFBFBD>8<EFBFBD>,<2C>Y<EFBFBD>7<>>B<>
2025-12-04 22:03:02 +08:00
<EFBFBD>8<EFBFBD>,<2C>]<5D>;<3B>;<3B> <20>I<EFBFBD>-<2D>-<2D>"<22>8<EFBFBD>,<2C>Y<EFBFBD>7<>7<>7<>9<EFBFBD>D<>7<>7<>7<>7<> <20>L<EFBFBD>0<>0<>"<22>8<EFBFBD>,<2C>\<5C>:<3A>:<3A>:<3A>i<EFBFBD>G<>:<3A>:<3A>:<3A><><EFBFBD><1C>,<2C>j<EFBFBD>9<><1D><1D><1D><1A>L<EFBFBD>!R<>X<EFBFBD>!R<>!R<>q<EFBFBD>!R<>!R<>S<>S<>S<><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><1D><><EFBFBD><EFBFBD>
2025-12-04 19:44:22 +08:00
!#<23> <1D>!<21>*<2A>/<2F>/<2F>"3<>"3<>4<>4<>L<EFBFBD> $<24>:<3A>:<3A>;<3B> <0C>U<>U<> <1C>(<28> 7<> 7<><08>"<22>8<EFBFBD>,<2C><05><1D>]<5D>+<2B><1D><05>i<EFBFBD>0@<40>A<EFBFBD>0E<30>0E<30>%<25>P\<5C>J]<5D>ab<61>Jb<4A>Jb<4A><1C><1F> <09>*<2A><07><1F> <09>*<2A><07>"<22><<3C>0<>
2025-12-04 22:03:02 +08:00
<EFBFBD> 0<>3<>3<>H<EFBFBD>c<EFBFBD>B<>B<> <0C> <20>7<EFBFBD>*<2A>Z<EFBFBD>7<>,<2C>F<><06>$<24>,<2C>X<EFBFBD>z<EFBFBD>B<>B<><08>!$<24>X<EFBFBD>%7<>%7<>%9<>%9<>!:<3A>!:<3A><0E>#<23> <20>&<26>",<2C>&<26> <20>$<24>*<2A> <12> <12> <0C>"<22>(<28>(<28><1C>6<>6<>6<>6<>$<24> $<24><><18> <16> <16> <16> <12>L<EFBFBD>Q<><04>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>sg<00>$K <00><K <00>&AF<02>,K <00>-#F<02>K <00>CF<02>K <00>G<05>)G <05>K <00> G<05>C:K <00>
K9<03>K4<03>.K9<03>4K9r<>r<>c<00>L<00>i}d}|D]<5D>}|r<>|<01><00><00>D]{\}} tj|<07><00>}|<08>d<02><00>|krA|<08>d<03><00>dkr(t |<08>dd<06><00><00><00>||<n<08>u#Y<00>yxYwnd||<|}<04><>|S)u获取前一天的余额Nr<4E>r<>r<>r<>rr<>)rWrXrYr<>r<>) r$r<>r<>r<><00> prev_dater<65>r<>r<>r<>s rr<>z"RedisClient._get_previous_balances<65>s<><00><00><1D><18><18> <09>$<24> !<21> !<21>H<EFBFBD><18> 1<>+6<>+<<3C>+<<3C>+><3E>+><3E>!<21>!<21>'<27>H<EFBFBD>i<EFBFBD>!<21>$(<28>J<EFBFBD>y<EFBFBD>$9<>$9<> <09>%<25>M<EFBFBD>M<EFBFBD>)<29>4<>4<> <09>A<>A<>%<25>M<EFBFBD>M<EFBFBD>)<29>4<>4<> <0C>D<>D<>9><3E>y<EFBFBD>}<7D>}<7D>[<5B>Z[<5B>?\<5C>?\<5C>9]<5D>9]<5D>,<2C>X<EFBFBD>6<>!<21>E<EFBFBD><45><EFBFBD>!<21> <20><08><><EFBFBD><EFBFBD><EFBFBD>-0<> <20><18>*<2A> <20>I<EFBFBD>I<EFBFBD><1F>s <00>A,B<04>Bc<00><00><>K<00>g} |<00>|<01><00>}g}|<03><00><00>D]0\}}|<00>||<06><00>}|<04>|<07><00><00>1t j|ddi<01><01>d{V<00><03>}|D],} t | t<00><00>r|<02>| <09><00><00>-n.#t$r!}
tj d|
<EFBFBD><00><02><00>Yd}
~
nd}
~
wwxYw|S)u!收集所有账号的订单数据r<E68DAE>TNu收集订单数据失败: ) r<>rW<00>_collect_exchange_ordersror<>r<>rlr<>r<>r6rr7) r$rF<00>
all_ordersr<EFBFBD>r<>rar<>r<>r<>r^r8s r<00>_collect_all_orderszRedisClient._collect_all_orders<72>s(<00><00><00><00><17>
<EFBFBD> ;<3B>!<21>=<3D>=<3D>h<EFBFBD>G<>G<>N<EFBFBD><17>E<EFBFBD>-;<3B>-A<>-A<>-C<>-C<> #<23> #<23>)<29> <0B>\<5C><1B>4<>4<>[<5B>,<2C>O<>O<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> .<2E> .<2E><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>.<2E><1E>%<25>%<25>f<EFBFBD>-<2D>-<2D>-<2D><> .<2E><><19> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><1A>r<>c<00><00> K<00>g} g}|D]Y}t|d<00><00>}|<05>dd<03><00>}|<00>|||<01><00>}|<04>|<08><00><00>Zt j|ddi<01><01>d{V<00><03>} | D],}
t |
t<00><00>r|<03>|
<EFBFBD><00><00>-tj
d|<01>dt|<03><00><00>d <09><05><00>n1#t$r$} tj d
|<01>d | <0B><00><04><00>Yd} ~ nd} ~ wwxYw|S) u$收集某个交易所的订单数据r<E68DAE>r<>rr<>TNr<4E>r<>u
条订单r<E58D95>u 订单数据失败: )r<>r<><00>_get_recent_orders_from_redisror<>r<>rlr<>r<>rrVrBr6r7) r$rar<><00> orders_listr<74>rcr<>r<>r<>r<>r^r8s rr<>z$RedisClient._collect_exchange_orderss^<00><00><00><00><18> <0B> S<01><16>E<EFBFBD> ,<2C> #<23> #<23> <0C><1A><<3C><06>/<2F>0<>0<><04>$<24>(<28>(<28><17>!<21>4<>4<><05><1B>9<>9<>$<24><05>{<7B>S<>S<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>#<23>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> /<2F> /<2F><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>/<2F><1F>&<26>&<26>v<EFBFBD>.<2E>.<2E>.<2E><> <12>L<EFBFBD>[<5B>k<EFBFBD>[<5B>[<5B>s<EFBFBD>;<3B>?O<>?O<>[<5B>[<5B>[<5B> \<5C> \<5C> \<5C> \<5C><><18> S<01> S<01> S<01> <12>L<EFBFBD>Q<>K<EFBFBD>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<> R<> R<> R<> R<> R<><52><EFBFBD><EFBFBD><EFBFBD> S<01><><EFBFBD><EFBFBD><1B>s<00>C C<00>
D<03>C<<03><Dc <00><00><>K<00> |<03>d|<01><00>}td}tj<00><00>}g}t|<05><00>D]?}|t |<08><03><00>z
} | <09>d<04><00>}
|<07>|
<EFBFBD><00><00>@d} g} |j<00>|| d<07><08><00>\} } | <0A> <00><00>D]l\}}t|t<00><00>r|<0E> d <09><00>n|}|d
kr<01>8|D]1}
|<10> |
d z<00><00>r| <0C>|<10><00>n<01>2<EFBFBD>m| dkrn<01><>| sgSg}d }tdt| <0C><00>|<12><00>D]<5D>}| |||z<00>}|j<00>||<13><00>}t!||<14><00>D]<5D>\}}|s<01> t#j|<15><00>}|<16>d d<05><00>}|t)t+j<00><00><00><00>|dzdzz
kr$||d<||d<||d<|<11>|<16><00><00><>#t"j$r$}t/jd|<0E>d|<18><00><04><00>Yd}~<18><>d}~wwxYw<01><>|S#t2$r&}t/jd|<01>d|<18><00><04><00>gcYd}~Sd}~wwxYw)u'从Redis获取最近N天的订单数据z:orders:r<>)r<>r<>rTi<54>)rhrir<><00>_i<5F>r<><00>ir<>r<>rau解析订单JSON失败: key=r<>Nu$获取Redis订单数据失败: k_id=)rrr<><00>ranger<00>strftimeror(<00>hscanrWrlrmrn<00>
startswithrB<00>hmget<65>ziprXrYr<>r<>r<>r\rrVr6r7)r$r<>r<>rar]r<>r<><00> recent_dates<65>i<>date<74> date_formatrs<00> recent_keysrtrur<>rvr<><00>
chunk_size<EFBFBD>
chunk_keys<EFBFBD> chunk_values<65>
order_json<EFBFBD>order<65>
order_timer8s rr<>z)RedisClient._get_recent_orders_from_redis)s,<00><00><00><00>G <16>&<26>6<>6<><04>6<>6<>I<EFBFBD>%<25>m<EFBFBD>4<>K<EFBFBD><1C>L<EFBFBD>N<EFBFBD>N<EFBFBD>E<EFBFBD><1D>L<EFBFBD><1A>;<3B>'<27>'<27> 1<> 1<><01><1C>y<EFBFBD>a<EFBFBD>0<>0<>0<>0<><04>"<22>m<EFBFBD>m<EFBFBD>J<EFBFBD>7<>7<> <0B><1C>#<23>#<23>K<EFBFBD>0<>0<>0<>0<><17>F<EFBFBD><1C>K<EFBFBD> <1A>#<23>{<7B>0<>0<><19>F<EFBFBD>$<24>0<>O<>O<> <0C><06><04>"<22>j<EFBFBD>j<EFBFBD>l<EFBFBD>l<EFBFBD>
"<22>
"<22>F<EFBFBD>C<EFBFBD><11>5?<3F><03>U<EFBFBD>5K<35>5K<35>T<>c<EFBFBD>j<EFBFBD>j<EFBFBD><17>1<>1<>1<>QT<51>G<EFBFBD><1E>+<2B>-<2D>-<2D> <20>(4<>"<22>"<22> <0B>"<22>-<2D>-<2D>k<EFBFBD>C<EFBFBD>.?<3F>@<40>@<40>"<22>'<27>.<2E>.<2E>w<EFBFBD>7<>7<>7<>!<21>E<EFBFBD>"<22><><1A>Q<EFBFBD>;<3B>;<3B><19>! <1A>$<1F> <1A><19> <09><1D>K<EFBFBD><1D>J<EFBFBD><1A>1<EFBFBD>c<EFBFBD>+<2B>.<2E>.<2E>
<EFBFBD>;<3B>;<3B> !<21> !<21><01>(<28><11>1<EFBFBD>z<EFBFBD>><3E>)9<>:<3A>
<EFBFBD> $<24>{<7B>0<>0<><19>J<EFBFBD>G<>G<> <0C>'*<2A>:<3A>|<7C>'D<>'D<>!<21>!<21>O<EFBFBD>C<EFBFBD><1A>%<25>!<21> <20>!<21> $<24>
<EFBFBD>:<3A> 6<> 6<><05>&+<2B>Y<EFBFBD>Y<EFBFBD>v<EFBFBD>q<EFBFBD>%9<>%9<>
<EFBFBD>%<25><13>T<EFBFBD>Y<EFBFBD>[<5B>[<5B>)9<>)9<>K<EFBFBD>"<22><L<>t<EFBFBD><S<>)S<>S<>S<>,0<>E<EFBFBD>&<26>M<EFBFBD>-2<>E<EFBFBD>'<27>N<EFBFBD>3><3E>E<EFBFBD>-<2D>0<>'<27>.<2E>.<2E>u<EFBFBD>5<>5<>5<><35><EFBFBD><1F>/<2F>!<21>!<21>!<21><1E> <0C>%T<>C<EFBFBD>%T<>%T<>QR<51>%T<>%T<>U<>U<>U<> <20><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD>!<21><><EFBFBD><EFBFBD>!!<21>(<1F> <1E><><18> <16> <16> <16> <12>L<EFBFBD>Q<><04>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>sP<00>D)I<00>.A$I<00>A;H<04>I<00>I<07>H=<07>8I<00>=I<07>I<00>
I8<03>I3<03>-I8<03>3I8c<00>r<00>|jr/|j<00><00><00>tjd<01><00>dSdS)u关闭连接池uRedis连接池已关闭N)r<00>
disconnectrr5r#s r<00>closezRedisClient.closeusA<00><00> <0F>:<3A> 3<> <10>J<EFBFBD> !<21> !<21> #<23> #<23> #<23> <12>K<EFBFBD>1<> 2<> 2<> 2<> 2<> 2<> 3<> 3r)#<23>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rrr%<00>propertyr(r'r <00>strrGrrr>rArZr r[r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<00> __classcell__)rs@rrr s<><00><><00><00><00><00><00>!<21>!<21><14>I<EFBFBD><1D><1D><1D><1D><1D> K<01>K<01>K<01><0E><1C><1C><0E>X<EFBFBD><1C> <12><12><12>*<16><14>c<EFBFBD>4<EFBFBD>i<EFBFBD><1F><16><16><16><16>4(<28>T<EFBFBD>#<23>Y<EFBFBD>(<28>(<28>(<28>(<28>,<1D>C<EFBFBD>,<1D>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD>,<1D>,<1D>,<1D>,<1D>\'<1D><04>S<EFBFBD>$<24>Y<EFBFBD><0F>'<1D>'<1D>'<1D>'<1D>T"<1E>c<EFBFBD>"<1E>c<EFBFBD>"<1E>"<1E>"<1E>"<1E>H<18><13><18>#<23><18>S<EFBFBD><18>U]<5D>^b<>Uc<55><18><18><18><18>. <16>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD> <16><04>S<EFBFBD>RV<52>W[<5B>R\<5C>_<EFBFBD>H]<5D> <16> <16> <16> <16><1D>T<EFBFBD>#<23>t<EFBFBD>)<29>_<EFBFBD><1D><14>d<EFBFBD><1A><1D><1D><1D><1D>6<1E>S<EFBFBD><1E>PT<50>UY<55>PZ<50><1E>_c<5F>dh<64>_i<5F><1E><1E><1E><1E>0<16>C<EFBFBD><16><03><16>RU<52><16>Z^<5E>_c<5F>Zd<5A><16><16><16><16>2 <20><04>S<EFBFBD>$<24>Y<EFBFBD><0F> <20>D<EFBFBD>QU<51>J<EFBFBD> <20> <20> <20> <20>:!<21><03>!<21>SW<53>X\<5C>S]<5D>!<21>bf<62>gk<67>bl<62>!<21>!<21>!<21>!<21>(b<16>s<EFBFBD>b<16>3<EFBFBD>b<16>UX<55>b<16>]a<>bf<62>]g<>b<16>b<16>b<16>b<16>H <20>$<24> <20>d<EFBFBD>3<EFBFBD>i<EFBFBD> <20>TX<54>Y\<5C>^c<>Yc<59>Td<54> <20> <20> <20> <20>2<1A>$<24>s<EFBFBD>D<EFBFBD>y<EFBFBD>/<2F><1A>d<EFBFBD>4<EFBFBD>j<EFBFBD><1A><1A><1A><1A>4<1B>#<23><1B>T<EFBFBD>RV<52>Z<EFBFBD><1B>\`<60>ae<61>\f<><1B><1B><1B><1B>4I<16><03>I<16>C<EFBFBD>I<16>VY<56>I<16>^b<>cg<63>^h<>I<16>I<16>I<16>I<16>X3<>3<>3<>3<>3<>3<>3rr)r<>r1rXr r<><00>logurur<00>config.settingsrrrr<00> utils.helpersr<73><00>typingrr r
r r r rrrrKrr<00><module>rs<><00><01><0E><0E><0E><0E> <0C> <0C> <0C> <0C> <0B> <0B> <0B> <0B> <09> <09> <09> <09> <0B> <0B> <0B> <0B><19><19><19><19><19><19>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B>[<5B><1F><1F><1F><1F><1F><1F>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>m 3<>m 3<>m 3<>m 3<>m 3<>m 3<>m 3<>m 3<>m 3<>m 3r