From 8d4ef8c6b0f264f2b03e4352cd79be8abb6f222e Mon Sep 17 00:00:00 2001 From: ordm Date: Fri, 28 Jan 2022 13:41:15 +0300 Subject: [PATCH 1/4] case study --- case.md | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 case.md diff --git a/case.md b/case.md new file mode 100644 index 0000000..930d278 --- /dev/null +++ b/case.md @@ -0,0 +1,205 @@ +## Сбор DX-метрики + +- Настроил сбор и отображение местрик с помощью TICK + +Исходные измерения: +``` +Количество тестов: 680 +Время выполнения тестов: 71 сек. +``` + +## Оптимизация + +### №1 +Выполнил `rspec --profile` + +``` +Top 10 slowest examples (46.05 seconds, 73.9% of total time): + Lighthouse::Loader.load returns reports + 35.8 seconds ./spec/services/lighthouse/loader_spec.rb:11 + DomainPolicy forbid unlimited create search phrases + 8.36 seconds ./spec/policies/domain_policy_spec.rb:24 + AccountNotificationsService when notifications present #send_notifications changes a account notified date + 0.32117 seconds ./spec/services/account_notifications_service_spec.rb:30 + Google::PageSpeed::BaseService.load returns reports + 0.2995 seconds ./spec/services/google/page_speed/base_service_spec.rb:12 + Google::PageSpeed::Loader.call when limits are exceeded does not create request + 0.29272 seconds ./spec/services/google/page_speed/loader_spec.rb:40 + Google::PageSpeed::Loader.call when limits are exceeded does not reduce the quota + 0.25092 seconds ./spec/services/google/page_speed/loader_spec.rb:45 + Google::PageSpeed::Loader.call when limits are exceeded raises error + 0.22131 seconds ./spec/services/google/page_speed/loader_spec.rb:36 + Ssl::Reporter#create_report creates a report + 0.18945 seconds ./spec/support/shared_examples/reporter_examples.rb:12 + AccountNotificationsService when notifications present #send_notifications returns count of enabled notification + 0.15965 seconds ./spec/services/account_notifications_service_spec.rb:40 + AccountNotificationsService when notifications present #send_notifications returns only enabled notification + 0.15415 seconds ./spec/services/account_notifications_service_spec.rb:44 + +Top 10 slowest example groups: + Lighthouse::Loader + 35.8 seconds average (35.8 seconds / 1 example) ./spec/services/lighthouse/loader_spec.rb:5 + DomainPolicy + 2.8 seconds average (8.41 seconds / 3 examples) ./spec/policies/domain_policy_spec.rb:5 + Google::PageSpeed::BaseService + 0.29995 seconds average (0.29995 seconds / 1 example) ./spec/services/google/page_speed/base_service_spec.rb:5 + Ssl::Reporter + 0.19018 seconds average (0.19018 seconds / 1 example) ./spec/services/ssl/reporter_spec.rb:5 + Google::PageSpeed::Loader + 0.15739 seconds average (0.94433 seconds / 6 examples) ./spec/services/google/page_speed/loader_spec.rb:5 + Google::PageSpeed::QuotaChecker + 0.13753 seconds average (0.55011 seconds / 4 examples) ./spec/services/google/page_speed/quota_checker_spec.rb:5 + Lighthouse::Reporter + 0.11583 seconds average (0.34749 seconds / 3 examples) ./spec/services/lighthouse/reporter_spec.rb:5 + AccountNotificationsService + 0.11011 seconds average (0.88092 seconds / 8 examples) ./spec/services/account_notifications_service_spec.rb:5 + Google::PageSpeed::Reporter + 0.10417 seconds average (0.3125 seconds / 3 examples) ./spec/services/google/page_speed/reporter_spec.rb:5 + DataCleaner + 0.10119 seconds average (0.20238 seconds / 2 examples) ./spec/services/data_cleaner_spec.rb:5 +``` + +Есть точка роста `35.8 seconds ./spec/services/lighthouse/loader_spec.rb:11`, внутри класса идет прогон lighthouse, замокаем этот прогон + +Внес изменения: +``` +Время выполнения тестов: 34 сек. +``` + +Время выполнения сократилось в 2 раза, точка роста ушла + +### №2 +Выполнил `rspec --profile` + +``` +Top 10 slowest examples (10.72 seconds, 40.2% of total time): + DomainPolicy forbid unlimited create search phrases + 8.64 seconds ./spec/policies/domain_policy_spec.rb:24 + AccountNotificationsService when notifications present #send_notifications changes a account notified date + 0.33898 seconds ./spec/services/account_notifications_service_spec.rb:30 + Google::PageSpeed::Loader.call when limits are exceeded does not reduce the quota + 0.31088 seconds ./spec/services/google/page_speed/loader_spec.rb:45 + Google::PageSpeed::Loader.call when limits are exceeded does not create request + 0.29836 seconds ./spec/services/google/page_speed/loader_spec.rb:40 + Google::PageSpeed::Loader.call when limits are exceeded raises error + 0.29587 seconds ./spec/services/google/page_speed/loader_spec.rb:36 + Google::PageSpeed::BaseService.load returns reports + 0.26205 seconds ./spec/services/google/page_speed/base_service_spec.rb:12 + Favicon::Notifier#check_and_notify when there is a difference checking receiver + 0.19364 seconds ./spec/support/shared_examples/notifier_examples.rb:41 + Lighthouse::Loader.load returns reports + 0.13372 seconds ./spec/services/lighthouse/loader_spec.rb:11 + AccountNotificationsService when notifications present #send_notifications sends a email with notifications + 0.13202 seconds ./spec/services/account_notifications_service_spec.rb:26 + Google::PageSpeed::QuotaChecker.call when limits exceeded when the interval request limit is exceeded returns error + 0.11923 seconds ./spec/services/google/page_speed/quota_checker_spec.rb:34 + +Top 10 slowest example groups: + DomainPolicy + 2.89 seconds average (8.68 seconds / 3 examples) ./spec/policies/domain_policy_spec.rb:5 + Google::PageSpeed::BaseService + 0.26252 seconds average (0.26252 seconds / 1 example) ./spec/services/google/page_speed/base_service_spec.rb:5 + Google::PageSpeed::Loader + 0.18792 seconds average (1.13 seconds / 6 examples) ./spec/services/google/page_speed/loader_spec.rb:5 + Lighthouse::Loader + 0.13445 seconds average (0.13445 seconds / 1 example) ./spec/services/lighthouse/loader_spec.rb:5 + Lighthouse::Reporter + 0.11119 seconds average (0.33357 seconds / 3 examples) ./spec/services/lighthouse/reporter_spec.rb:5 + DataCleaner + 0.1041 seconds average (0.2082 seconds / 2 examples) ./spec/services/data_cleaner_spec.rb:5 + Google::PageSpeed::QuotaChecker + 0.1035 seconds average (0.414 seconds / 4 examples) ./spec/services/google/page_speed/quota_checker_spec.rb:5 + AccountNotificationsService + 0.10034 seconds average (0.80273 seconds / 8 examples) ./spec/services/account_notifications_service_spec.rb:5 + Google::PageSpeed::Reporter + 0.09067 seconds average (0.272 seconds / 3 examples) ./spec/services/google/page_speed/reporter_spec.rb:5 + Favicon::Notifier + 0.09044 seconds average (0.54262 seconds / 6 examples) ./spec/services/favicon/notifier_spec.rb:5 +``` + +Есть точка роста `8.64 seconds ./spec/policies/domain_policy_spec.rb:24`, обноружил ошибку, с созданием большого кол-во объектов, хотя для теста это абсолютно не нужно делать + +Внес изменения: +``` +Время выполнения тестов: 20 сек. +``` + +Время выполнения сократилось, точка роста ушла + +### №3 + +Профилирование фабрик: +``` +[TEST PROF INFO] Factories usage + + Total: 4329 + Total top-level: 1391 + Total time: 00:12.267 + Total uniq factories: 17 + + total top-level total time time per call top-level time name + + 543 105 4.1367s 0.0076s 0.3333s project + 527 189 7.4906s 0.0142s 1.9339s domain + 527 0 1.0937s 0.0021s 0.0000s country + 510 55 2.2853s 0.0045s 0.3745s user + 507 89 4.9118s 0.0097s 0.3722s client + 507 3 3.1166s 0.0061s 0.0235s account + 396 396 0.6260s 0.0016s 0.6260s page_speed_request + 388 173 6.9221s 0.0178s 2.6414s url + 173 133 1.6504s 0.0095s 0.7521s task_setting + 149 146 4.5260s 0.0304s 4.3825s metric + 52 52 0.1272s 0.0024s 0.1272s notification + 18 18 0.1314s 0.0073s 0.1314s group + 10 10 0.0469s 0.0047s 0.0469s search_phrase + 10 10 0.0185s 0.0018s 0.0185s page_speed_quota + 8 8 0.3242s 0.0405s 0.3242s downtime_metric + 3 3 0.1662s 0.0554s 0.1662s lighthouse_report + 1 1 0.0136s 0.0136s 0.0136s url_import + +``` + +RSpecDissect: +``` +[TEST PROF INFO] RSpecDissect report + +Total `let` time: 00:13.215 +Total `before(:each)` time: 00:10.194 + +Top 5 slowest suites (by `let` time): + +AccountNotificationsService (./spec/services/account_notifications_service_spec.rb:5) – 00:00.767 of 00:00.787 (8) + ↳ domain – 8 + ↳ subject – 8 + ↳ notifications – 4 +Google::PageSpeed::Loader (./spec/services/google/page_speed/loader_spec.rb:5) – 00:00.628 of 00:00.876 (6) + ↳ page_speed_quota – 10 + ↳ subject – 5 + ↳ page_speed_request – 3 +DomainsController (./spec/controllers/domains_controller_spec.rb:5) – 00:00.473 of 00:00.672 (22) + ↳ domain – 23 + ↳ params – 22 + ↳ user – 16 +Metrics::MetricDecorator (./spec/decorators/metrics/metric_decorator_spec.rb:5) – 00:00.469 of 00:00.490 (12) + ↳ metric – 7 + ↳ decorate_metric – 6 + ↳ result – 1 +Api::V1::Doma...UrlsController (./spec/controllers/api/v1/domains/urls_controller_spec.rb:4) – 00:00.437 of 00:00.710 (18) + ↳ user – 18 + ↳ domain_params – 7 + ↳ url_params – 7 + +Top 5 slowest suites (by `before(:each)` time): + +DomainsController (./spec/controllers/domains_controller_spec.rb:5) – 00:00.558 of 00:00.672 (22) +ClientsController (./spec/controllers/clients_controller_spec.rb:5) – 00:00.506 of 00:00.638 (28) +ProjectsController (./spec/controllers/projects_controller_spec.rb:5) – 00:00.493 of 00:00.614 (32) +AccountNotificationsService (./spec/services/account_notifications_service_spec.rb:5) – 00:00.447 of 00:00.787 (8) +Google::PageS...::QuotaChecker (./spec/services/google/page_speed/quota_checker_spec.rb:5) – 00:00.360 of 00:00.379 (4) +``` + +Добавил `parallel_tests`, сделал пару запусков и не получил ускорения прогона тестов значения +-2 сек. от времени запуска в 1 поток. + +## Итого +- Настроил систему мониторинга DX метрик +- Уменьшил время прогона с 72 сек. до 20сек. From 9d10cb6643abc4ec4ff5d908e98b8fbe2d205552 Mon Sep 17 00:00:00 2001 From: ordm Date: Fri, 28 Jan 2022 13:49:34 +0300 Subject: [PATCH 2/4] optimization --- 1.png | Bin 0 -> 39876 bytes case.md => case-study.md | 1 + 2 files changed, 1 insertion(+) create mode 100644 1.png rename case.md => case-study.md (99%) diff --git a/1.png b/1.png new file mode 100644 index 0000000000000000000000000000000000000000..621486de55132374fdbe7fe9bddd25bf9dcb0263 GIT binary patch literal 39876 zcmb5W2T+sg+CCnaRd!Y6tPSaUL=ll91nEUx#885Ck)~2Y=)FTgSFunu^sbc9VWsz= zXy_n>A}xUQ-U&7NKW_+ozVFO@znMQXJ1fbXr{3kduKNzJA0U;Ojm*wX0O2StS*WVU9{{iT-={HnZrf>?lQ+7k)L`qw)uKdV& zeUlLVmgirmqvKM~UlhD^`u;`7_wRO`cHA}=pS&kT=&^pw)muGdhmk3ln4nelXoez9}b;4_{lgk7DpJ% zXF@dMZXUd%kZ@rb&V}jzX9gvge+K_#>UQ|=2kKd-^#s#|!>PK$I)8Y5LLN?3;pCF; zsFQv;rmSQIu`HE%;b4jn6pmuFjB7j2&Mq--aI77)Nv9tzezQIl2Nn)<&6a z*}N6R=xg)6Aj>Tn?3+g1GA%A`r#7S%4Gc`Ngul$R=-H^tnR_nT%UqbpZDAzeQXv=Z zye~Yr^Q33vbNpPOKK%{umKb$$ug5-rrhj^VxYiwEzsK<$pU^qohwGCI$Ib>y1s^$> zHRJM?f41prGyl3v=Rdz%RDCIn4Od2Y9UNC}re(#?Y_ui1eVJ0t`eW0u!x84MuA>a@ z6FvV&ckrno+L#ioOcRkU)O70A;G{~ApN}TC>sLuh`+fnLF#jK23@9uWu(Y{B}V17N>3gXr>{Q(aA z=Y#>L5qWB}_O5p)erDz5Vt-_SUZRTY2mG`ptd^H;L4<2q!tTb*fkln*h$WI=tlRGC zdvR?q@wM`yNb;1i7UQyO&!vrTNU_0|Ki#VgsuvGoe|lgI{$bjShLKG@ykR`u0X6G+ z)x5UNdgs}X!?w->!_&(~zoHv2@(wY|zM&z2EV91Y_S)K)o$LPCv$al_4S}Oq8DMhy zuIterHe(OzCdZpL_zAvmAnrH5^HD6@neayED91qy>_uTD(2suWMZ0Z3}!EwDMuZ@ z|2uU257=X+Bhv~z_vm^(b{oc1 z91Wp<%TZ^BO?+mO4Ob@k*CyGe3#V6wregD5#ybMJTl7(_%|FxJ&Ds~m3+$Ijznr1P zg%;J|6K&1&FQO)&<9Ei?_sSECjU;!;6bau@D$jHKh4^F_SZzA{kg#CHRjJ^xM?c_P z92^a8ocXA!klsS;sgQUKWomV`#CAr~<=P1r!Ipsi-L*kcb=3aYoaXfir_V=Cu1V1> zsy3+0WvEkqP=rfQcFWJJXE3a1A{%${9L!;la4Wdpm_4gIwMQx#?=Z?DYES9wTOTAM zu&aZSCr{~Oc_Jtj9)yau%9CxHaat5OO?7IQ*vaH2Eg1Di^syKx;uL!mCbeO;EBxkr z@nw(H*i^(i(LSm9E`~|I-sH(vanjb0q)e`Qlk&{WcpPq3qql!xD#=R5;x}4Y;BG1R zi+26*u)sWNC?68L@kNCwT*>E5@|Je)Z==oquA{$Jb$v$j*}NxZmPdi znItnR-&>i-FVL)q^t%Wf`KlAzjW)a-N3gX;jbjy~(!AH!SUEW2%P3!Z1UxBy>CSb% zc5R9*Cb43nGU2}7!-B$m(0H{iS~Z)SC#$P3*DWndj>=1y`C7kptHzd`Et%hjaO%)V+GCJh{z!YEMPL zW`gZ5L=kRIC3s%XV|vU; zS1LC}LkG0M&ZN`1HZ6-bs#)z?Itq)AUqPDElPX6jq22EiaHsa#5)|)*-#&iJldVlg zy0w>di;v6zLq6EJoIs%G=i2(~?l;t^k-S$o605B%J4=3w^KK-Vy`f4GZXz{$_ZMi}}5sU6HLx>oC71lB*F| zp$OAN4+1X^TV7E<6G!NvKgt{Dy3v|xF^8DYzp(o$nXUD#L>Amj$~ zpTW&kq_GZeYu=OdAQx3D6;CO6aqVmLM-Kb;lNewU{i8}+p>`Z|^b3n_N>CB4S|}${ zl49q;XXX=$i(kyJ$5CW}~8P{%znunfkrsk+0w zivzP}x~MOtWY#m`sheL-vyS)^P4|2b^AmT6%S5k80X5;|(vZ%>mn5-lqR+RDnEkZu z%WDX|AHmG7)km(`M+Q&8znx*K_m}M0Im+++u`vWvmE}tvElW zTPF`fS#2U*IueIzewmz-N}UPRvO=qun<6?iU>_!fl9;&{;UV;dN+=CVQY|Jw?$E&U zR9ow%yKWCD*2DZ`*WM$?zS7YkqTCq@88@T|e+5J(H7`q75}oSZ--i4G6Po~L{`z1j ze=l+C&r_XSlPVs2GOQR#?(>`gB@LuIiP_Imm`-Y;JZS$CJ$a0xP%Dspq3BrONS{T7px zQ(y{e5?MrvLnO9g*A|thtekdo!KZxsTD|td9HKpzdm`wZI}7JgnAMl9?d2^39i941 zftbJ(u^6mazxAiD`d|{F{f6pVgb6=bX^Th7R9&ESFnd^kKit@%t-O3Da=?k?IW=Wp z;TLTr?QXF+7`fN8w6~}s?@kS^Ta_`bDU#Z8#zV^AoF$N zJ$=E^KfbpMAi~)6?@qQkY)NAF#(o=>!_A+W@~vnZ!xq??*@XM)E2D-uLy*49R^^T2gWaVNBZ8l#_7y&;W5O7>uY4Qo?nE zr0Y@y$2pKE|R1{*zhMDTEiNfJ??`M&*o=i{C2?5cgyoAZ96afz7CGfTZ)+DI*}?F?&>W!0xl0?=P` z=*jwk4S=-oD?A0U0b0Io_W>sq^O?o(eI#x&HFMh(lb5#8!l&xWk?0H0#ZZ$_J-B+T zdpgy$7{&LXVa0~nT&O}+&2Af*VaY+_kyK5wNvK4u}m8q2`AIn|V%*9h>JdizJt zK1x4-U#Yu2=|?et>0pJ#TAT55COKPsr*n8%dd1g!cMrk-D>077N+9^r0<4RMOCGmD z3p{`sOl$bP;&r<+c?L!@X1=|sC?O_MeQW;?$6(TIEH`en#C~dDp30(_p2;fLd$6xH z1i)`v%3@+Y=)Hb^AymhNNn3KWVEY##pPSuQV&3GMh~~U95tHf_T#o1XN4S_+TG#h? z?wdQkDCn{j_G5iXETYzwa#oM+^5m5G@I*1A7^*iWTr$cqF2FWvPa6Rnu{@JNFwIYi zBZz5QRZ%{<#t^&0zctq+e*XMfW^aU{Z+CORlbqnLCD`5?EIx#_a^-24U3+V@Kr(bO zgl6&o0tW%y97HJ7_^R3ar*icZN+z;b^X{6$BrerY!v(ul(^qO0uER#}D5XdE74jPp@kCojkz+4GBzv|7?E)q&W+8?f{B&bqw7h-mu2=6+Tu)_9(o50F zb0Fkc`~|4%3a@6UEnBZL9bY8n41SVe$hSjojCd<5#lY)!N%w~djGZM%^D3vOwL7`ZGKUNf+XwH^;(d z@4UdtrpLI`S-F{5Bv5L55)g>JS_#QPG)LM2O)t)a5RSO~drj9ea1e^aFBv<_Mhejt zJCPuy))wh1^94!=)k_DT2>ulsyjB~;G&K-#I&LDf?^^3log5;-mS5lF52i=*u86)9 zENLIh#hwq8p68q>V)Gcy4C3fdDlf%UPG5rwx6)~02LD7z+RTz)^7I9*WR#I!e`LOD zW~QObSy(jg6!!%>R>(Lr(FU@nyuM2i-_7+&>&&WU?S7EwKwwr?0Z}>h2fPGD6FweP z#^zV>)h*!@Mt$wia+)`-=PW2UFJPn#<(+RshuObvneN#Ao(32c1gvZ95IdFP=Q&N4 zb(m|C62-`=uG?AAme=7mXv19G=po-N#(ng(YvNSV>MQs-eN8LR-AK>E#KSZ8ypbNX zSc|Mc@n998deCv!gD}A0aGlkcx@+z#D)If<-rtSZ_jB*K340tXc`uzVy!iKb0Tdd+ zGCK!uGfRg0P?;&MrFx|eS^!*AR`;Lh9uYm-rbKu5gwhH&SipGNOBH!VH%w@jdQX|2 z6K8Kb*JHIya)hMrjUFqtZ~dO9*Eu1RuGGaCPbMcuJ%L z7KK(m_Zx^b$T4scASj?~b|zcOm)}5{__MO9_cxHUnONoNUStuTZxTrnI29Z!qK#-z zA^*5_%>S}fuu59$lf7SAAjlh0_;c4?cWCj?DtBM;DqDTCWu+MobD}1oq>^ zfmQUgdCbh5TpEt*NgIZCe>OF|!}KTk43_R?u{TSd5j*0!>MySYhwSm{bxm{KZi2Vi z3P4Xkw)toG3w-W^YnHQP!bK===y^I``6bAfEwuVp&!hB}XU=V{YNdmbYi-i<7~)3V ze1Ewp6BASU#^x1$m%ekXY-}xI?BZrb=k~Ll=b#gKtl3H#j1rm4aTZx#T?5nq;nm|Z zF^^fTpYh$RXYH@9o|b?Kzc}U27Nwk-iySMQY;Df>BYR7Z1&J2eEu?s&hHH2llbiAJ z)-|2)nbc(>^-Me^-$s$%ADxQVa(F~L<;HHGA?&)Xv589%Yf8WOMcGiwHQVMTLC6$7 zU6u|O?E%&wtTx7OSH*X^u5SCY$-ZKVjhCRWuP*}o;sncNEoI+xF($o`vf|1Yp@9;Bh zFOvN(17XyHxYlm5kiwiMQ+nn3^9UY98eSgJ+1amYrcGNjqT6MABXg6hW!ZqM&?nie z$1TnFTb6do?6YGZkm1Uiy4ife)we>DF7`f~#5tYf+_@Mkx9U*i(V@7ltb{W5ok%mK z%&*+g6Bmmhc4^DaJ_6ac@m15w$Nx`>Fg;2iAc9dn@pJ$L5P0%T*;G+MwRBqkV4`T$ zeu8$A*Wc6d7pvuvx(I0cCWplGBG1swG;%DqAHKLS*SI)jZ?S8gKVBQKU%r}U?bM^c zM(iC3+Z1hA#)3Q>O0j{|fc*boYJg`fIzFM@(AAl=TS|prW+bc6<{I?3skZYBJ4z2UXe!>@&Tgx}6_|TdtP)pKO|?A>CkxG9G+P!7 zaiQ*~*K?}H*C-v_IQM;Zk-bF&#d^SuP{~9O7d(Xi7>`}w?%OB(j_))y+~@L~{w%Zl zz}H;^8Uj{~>Zx)T-F>S!S<6hZ?a;8O8YK@S>8y@{I$;8VVPr}jBOy(*Q+UU0_E0s* z5C`mOW_Zt|wd-H!bKP5K;U*}@TV#NfU3a&?A$3n})~He{7jnd7uz0R+Q&%>FgWw(Q*p$%Ri8lus z*Q&F&x!rs#VF zC;#9y#R*urS;x)Ud&6hQ=_{fqh&~g&P^1rg>Qh(th;vBDF8Z1z4TU}Kx0WG4YuRb} zqHVmT*r7424CPg$nk*3Wh54?Y3aY;qLa%tVT%2gT!un(NPcSeN0F`^!ePg_vOQCVo zZG7ssGX4>6M1j~;ux>x}&?Ts%3+P`!T1bO?BLP?#2@jX+M03z7wCLw}l|01DK+$yq zzoJs6${}4DEG~fVR5_#{j_efndq%?{wd+6_j-}Wc5EN&<=Sf9=``$6dBYRL{N3ajU z^JeL{iUu&j;sb=EX8V^Z?wzHZfoOwISFn*(01iUL>9`lCRu`(r?Iio;)t#o5G? zr{)07jQr(WMD&=a=kA%z!SWmXLnT4!aRGYbD2MhCpo7do*z}B35Xi1{RREo};>=>M zyW7X=VXoDoA@P#rO2%!pMWDfYpkpr!26{vX+U7t8dt7m#l`$#SkC>iZ^1kfL&b_xbr8{aW-#y%o3ecIvE(e}6+sfrs zR2n^_eF%+BbfA+I1ag__@ZquJz_DxgK?W*u>Y%pJj+>b^fD9?g>M2nI!G|yv>kijs z&n83}dg(9jOqPaJY%WpPhtnSAPL}#jxrbKx(G>wza~UXH`H$(w%JNQxn0t~?@2_Vn;Hy8A77qphr(vh%Cr88L2{doKe|AZh-xtWh|Lxm74sCBwb9fd?>z*K)eG zSJQJevq-=shS_gD9ZCnLQiEujek;SBy(yurNKIvxIo9<3*0{K-tB9RlZy;jIV?MJu zEuz|57sW{}5xs_SP|o(VKzHIbRGCr@cwV4ODAfR54KL-wM{iyJzo189B-vJ zzxTOAac@ITKr<}=K^HDvPF}rzK#xiR(Z?k)yR(Jbv8CU-70k@FcTs-lvk9oxEiXUd zqHHsGZcQP62Vzg_a*h~??BC&&1O?O4C;rFu z4toI(*_@&kV74b~s-^38-B>tZAUZ4UTp#HHLU|0vVeV7sQAI5K7-8q&3lBT3U@;tZD>U=i<5*D5&O_Q9O6AeVXpzmf zxlDH>XGVFgyVR`hh2B{ZC_<*;a#qA2c?Wb>gH66rIC$ztORb7J*cH({1DmL{MAJ}t zkN88;aysCUd7?kiv`*ePA)nDb)VE3Lqb=L$n#~dr`X5YXWnN7KB!CzBj^-2B?m%j* zZQlczlQ@MXpq1x>RDJ>0Ro%fb2Bh*cybaKW!c>cKD*0-z4j1d}YXI8E)q-W9Jg7BA zg1b;Q&9J8Dd|WVYE;6;CJJL~h#>n0N(bA(B&GKT9^1Arw^>dQ7fskTC7Z9#J03!A=x2ov(47=bQ&(48LP9&(!5!M7DdB8Oj z-t$1r`Df?De>iuhShlYp;P**Q=Y0tqS>zRN z)aFr^w3*d>fO!2YoP+*B5L(&LSqg;m)&Z{nQGr&_0n*J)ScWux%g6N=t1j;kaj6+C z?TE`J&Ne)lBo!q?TaEw)6kfWe;gDlfLdd%V`m8>#&K(-j$Giw7!77Dpz*Nm2fswW3!hREwRa3bZSLR)36m zzrEj^=ru(KN*)S&)F>lFkS)~qA49tX8VTOLf4*cs4Q0kBY^;9Ng>{-@Jq+pfuA@Lc zqjT!oE|8W#nYY~B$kR`l*+!A47&o1h6q1h%7pE zNT&7FZmIy30d#<2mXlnwi4}W`$)*R-L1N4m`g7?+Ife3ZeJ6y}(gsp8x6K%YPrg8xAYs2}Ws@&v;V*TTn)4l+<4Hb(pyF>N%c%Tb^@ z!Q+<~ysVY3x65FGrVm|{8ru>asj1ASR2gh-O5DP#2sIlG@AYW(QudQ5mFpWDQ06h~ zFxNA)v=mmi8+@nMF01uG8FHTwq?YZUQAA;Dx0h};+Ae1;-T`3^MUkh3t;m_~e!MO~Q&tFc4oF0x#ih6lJ=ot9xjIjgPBlrjoT88IjH2TZT|;6Z2#XFPq5?t~t0Jhy3llqoqPd zk&t544@fvvy9Xlt()>V_q;ss(jJe);taW~K3@Vt5YiaOP%19ApmkPPSD;jGjH$*pU zqi0MldrP!SWaA=%q@(x;)_k?N!vD{ z10vm%x=&vHzxoEG1fh8zj6n={xEkcyu2(gnPB_<#kJ3NU1_d5b(kR22X09t6x6IaU zzxC&M&_?tA{d<|!@6SQCg7L(CT8~^;3ZdONns9Uq^?0BVMB;lVmoU7()|l{;bJ+#d zcB&$9py*K$otW*}dI<+bI$Bc*KKM&=nZ?u`vPUgYJ!vwB35vK-TS3st zbDS@vG&rYKmSVj-OMIYOM)Yk^Bg=;RtN^QlE*%yh+o7Zdl#gSsIQuaMwBd3e+{jl2 zdi2sg=Ai79e7c}6%x7WZfM$C%AiC8LY7!3u0cFY^xB$A+)Rg(4t~YvLqQe`&*E)xD zo1>qe1XY5pz*DK_E2SXU)v7Lo63wB&s|7We1qg7dsX0QNW+N|xPb>m@3NBuwcc^4w z;lA61APx`lyWZ~5UT)D#509cScyNuX&VZzG&%#R%M01B#nb_EwWT;7k1;b0PH$)S% zl-$@*Im90ah4b1*(E64Rv1Bf_R`>&YD^w&cdDOz))^Y!&*Gxd4S6-=psDJ}|7b6`NrpXB<{9CS3rYufW{jkr~= z0*dfqib??~+KHGOX)j;WD-FU-!HLY=egAnp1wu2e>Ss9_LNeWlW{xq3 zA2B@#>>whS{Y}V`dN^qBIpz-9dnRZQf!K0WDwwXp#Aisd7{!EJm^(}XTv=N`>zl)$ z>+UDdgc7_4EQi?e=RXQVd=V&Q;W`&Ox>W7!mgW&lJG-F#1;M@Odsji_vY39x1t3Of z&iEBfUs%orvUu9|tbqt%Dj@aN!X3+q9_u4zm*{8;d4HR~6ablC(LIs@*tWVjt>i!} z@PvT_1PvxYqNii`+TYQO44_bGi6ov}`okl@5bje2I2tWi- zm1EuB(Xyqb6H<(Zs~|kA$^e=u>^P{&kv^1XCss@SHkK@`$&-8YlwA>bI~Bhu3Ap3982F^b-TqMVu0RTO+0bu6z?b$dYX!Ma>|IYj-gh3%dxp6wc zF*Dq%IF_(-X8cjdj~~%jnrj@pihD``sjd)XMo}sI2yC_e3>yuvBMl)%%XSOhadRYf zJ+D$6MIlhJi5ukfe)kLzu+N%-?qA@srUc|WYsLBvaUR6=h&pOhesQq?0(A35t$q$* zcri{(>=rcuNvn?aCA9+45oi<0rtgUh(0V~P=HzoKWeHj#LaX~q}HjM=)G#x>btI@)nP_QA0xXb{2eEzI?HFTPZT&yR|AX2( zy+^ofEItmuqmnsDO(Fui-JyZguHN^ZyFKxGmq=-*n!cnA%S+69$@=BZMf|7rkB=NP z4d;@Ukefh`S?ABGPHl*f3sL4UP5JqIt#Huo{kp!_V(iQu@0I11Sj=YM_TJGGVLVZS z6*mwCP_yQ9=2I4PkyC~H#d=VaX4NNaJ-c#O$H|215v?Wt%=I)p-u>t9=H_19s z|F6!)4T&kx5^0Vc{>bli-#VWwVOqoh+W2e#oQfEQ!Crlu;4 zV?ZASO0MxwnxKJnByLr-&8_`BVc;~A3_NbB84_`_^Q-Nen1h)Cw!!bbrAn>r3sG}T zXrcE;RwxbYJ3 zV;}s2>@NTY5Sn-~sS0$8%zNx_7;dG#EnG-rDRi!%i_uXqSq2anv~)QC)N?iCsjjY; zbXk53i3_)6$u@RXGm(bgMoNj^lPrDx)t*hFG`khmuFC<1g~+D!f!19ifIVt)vNjFI zL9E%I@0ORG%&S1LCOh=TP}SEDJ>Ze#}HEv68|IrOxAOUg;|gkMbby*5#~|H>3`Tm(?9w z1AuIzb|A=t>ED)j?bA^UvN6^3y;$mUJ8<&avl)}i0V{mAY}5gHN*zxl?dtOqq}SH9 z*s(ls1@ZsZGj`qJxkpnCuOYX0q&wG^K>$0Ft^*K5{JuJc$GOHu2jCZN7Y-P*5b96s zeW|qoms_e@(-IU<|M>9|qO+?j{OFXAMZqfV7SCF=eQEA|VAl#7?mz~a5fcdyV3JoG zc(cTk@T)(cFgk%SR$}XYle2gDops(qLqmfDC_tro7h+z}`V?AxS~=em@e{AXQHNh3 ztv|Fd@iKw{0{Jc2Cqpe74voO&w;WLQ$r;rqP2JPZ?w;=}lpZkld9r$%)+2p36(qY| z>Hs&0Q8-no@SayT@bRWXF#7_WYyUc5+NJIeA>_`>ZY$70b+OWIv4I_gArDIllZt69 z;tfsgdJr_3ZP&EC>n&Qf6bv>J4zlD(9~po=I#MK&Of1t@ zHpObq!i_yfU-a$m6#|zqFF1Yh@vJUGB+<3mX_}b=dLbS+{nKP;l)d`dgo*&xC&45) zh#qvvN+5uZw2-R3K`f0^+NXU!Iuo3n=-;lUS-ye5@Lx!Pvce>3>#*_8fz79kSauVr zLA)qZm1p_mQI^gQ&wY(v>Yn`GaQfM^knMlC20C;!J^gGuZhjE%rX;S*c&Yd64knPP z^JM5kQrQr7_^XSVN*3T$7{To8bSNJ zy7EE8QYO4~EyTxR7;|0fnCgj$MJA|YrloqrV8&=b2Uz*lR_HqynIV3T1$G8iH+DB` z61XWFCgXvaed@$Q>E?LJHx*vK8_>zrcEvb%bR)7@`-?#@lCUknd&&c=I()5(MgW6c zRYTk4dtjx4+hx{rKt3yn+6W+9o198&WnEYZJ9|)kpACn)P@xu&+9Hu6YlG_piE7O> zS*SJ@`l`*7pTBPNEDY`H+Eq-HxcF@lTnwq*Ai6AgTDK=6j?;`)*fkbZ@C%?)q3EU=evkXUY>A^!Qyf7aGeSA3eVx_{xt9A@Yi6naF0-64;tB1paQD{q?ApIC z_KNIL1_1s-11(T`#$Y$4D0d4IPovLvhbtqpK)YCQ$`Aou*B;4xX_67MJ*=5HfDQQk z8B`ByNF>DDgGHT#kYC>pXe)T!KMO>@Z9G{i#<{T=e3`}uGTbX^pBTmvv+x=qx~v&c zN4O{EkDd_8{uoXjEu}uG0U3o?fW|XxXL`Q7>Bi<)-Q16pjb)S5b>#`{$w7j%R^&Z0 z60YWyzS3GM&^VWmkA<)Wjn9_|s4Q;n@Vub$CW-yne1mvO>s;7p3h?D3UC?L-hl{2A zR6B$0U|U6$2qU5g2M6POjXfo+Wo4n7_hzqgV|<_U)yoGh^5NHLm1HOvvVKG@fUdK@ zZBGgp0*wg;%4zEw-OzFDZ1xs-^z}M-T#34hkRz9$DDd624hy3-iHyMGd?`^B%;us@ z)$C5&E_Ke^3G0kJUyw2%*L3wb);~Gp*T0i9x^?4ces;!ua`V!gZrP73&raB_SRCHN zMTDFiXw#N*9$wI1u`71{Y;@!gv%tU2U;JxR;F7mQV;>$bU!Y+2htsKT9?AB4R}Cx! zSK^A+O2ytXr6%H?*n@!TO4W3j@0||?_dkX)MmUj6$M-E`W;kF9rSW}en}HGzTk(dW zBsj%oqW-#opr+S7TqjXf`;lgji;HT`FjA!Av5Xn-CVOp!odRU{ss(#|a zJ9F@rx9^;rF$sjoE0P2ELMr9a^W<&qD(}*)tgIq?`*MzuUym{bJe;6~CEz;eCYs_> zCdK`1p>e*Xhh(|V)hkz$9mOc4M~RX!|K@JFCxa`mW;5K`)NA>kxiP%ASIvu`5eg6Fi$^Y0W|wCgO^ z2E05@^FSDE{rK;%oumZK5h0fDYMwz#bt~j)Tq3*I+CLmxB`Rk4c3y-sLhWWJjV*x$ z;(kBzmL5eD7ZhN5w5jBJ=irBMedZYC5tv~?o^)_R31|0*PyhbIARXClxj$ts=JWNw zxjCx2fa6nE^^K#>HOWoB=cF9>qEkyy_R<_v_T}M5ZGursf>G(s)-yAG8t%#VBROM? zC{AvPsjbiY^~`Njehxh=0nQ=Z@veK|t-DEbQ$ZY8LdtJ{WH!-Ie)MuC);JWew31SZ z0^Pltoi#h*r{9P-AK!Xv_=5kVI+ZI#g&;|m4-PKA>75_q{d6EQzGD%dC`%R$=8(O& z;acpqJa@uO{}dA&{7>#0DzfF7kfIwh1enn!1e>&7RceV5K~1gI%68?t>}4(NxKsHR zgn$4^$X6YY*O4<(nVJI2zA5|Ly79sK7^XPnCFbZ$mvd-ad0q%D-Di4kDqhMr&!@7t zd7vdF6R!%EUe(Hk6aCJREHyWIEYqwIz9uJDQw}eA@~XUs;w>S_G!^uA=L>Rd6EU_J z$`)GgmZO`$_h+x6cLI__KChL%caF5n9b~k8#mdI=yET;@(bkUNDLx90H^U8-iT=2J z4?Vy2I#$L!OGIQqFqD~Fs%s2r?p(^%uU1aa%J!=I<6ugE&)1jhn@3l#d3@*s2Acn)bz?Qp zQ-zN#_wgktBdSipV1k5_ZbvnnZ%@-#@;C>?#!3bztZj8X(XY9vbG*eVe+yew4;8Nu zV>-4Sc}{oC>hKqNbsvAOc(^A9b&}2Y8}Ya{*iKqxdldg1V|%lhpgLvM7Uv9uu{{0e zk-masn$y>GV)`e1)Hhshf-2?^awII?a) zDz@i$rHmP}F(}w?zDOXP8i+jmE%g&mf|O2L3X=^k|`8d zrc8@l&lx0y5v;gnX>0(nCcl<2af6zl!EcIg#UYRUywhAUp`1XD=3vb!_|>08kVB<^ z>Nk0{BILB*@W;_#0)EucN}6CrE@AxkA-|-lvNFhCF?7Boz)sTZ->X+khrwz-*nasD zGK3r}Ix-VWt-ZUG%}doqGjxiHQ7tCMCuiI9tFtO9`lDaaU_21A-6iwca9?j{Mw8fC2BgOE_IzaZt@!llO+4-Z; zEp|#m;ncSI&C{-}@1GfV7BDrbpPvUR7r6f1x>;OOLJ+(_-%avJV^T`R@Lt%=$%~7{ zK9mpai5Eo8$|#Uys}@Y3=(L@+739~t0YQ@@~em=YY>^4=z=T3NfHR`Iz`(4 z+ttItDjI=R1*Am0fonsCVm$rz$hMpPgZ}E!?3s3|g%l&~XRPmL>Zco$DMM(VVFnYe zdloON(yI$nJlp8s28Vr(md2F)k`@Q7*mBCK&`?s|FgcQGiQnbBl|}PmFTkEZv^ImD z@-V_1t8_;vrvhD{y^l@GZ%n)Cxdx`;oNC@A>sW!r?-~&KVEugp!K;3oxXwxWk2}<@ zB;eE+{d}Kv{&-Sa-DwNdgzjkY{lW$f(+VHD$-%;C$J>8R`YgDkksAVY!&*Q8ww{P} zCiKl!1OXc zmEsMqW2#q%ZoHt*A@-rB?zu{l* z3r=bBTj7sx`CL@|H?;4(_!xMJsVHbe6@8F$FSw(%l+-h^LEYNOPqw9@WZ?65E2?qX zgkB6zM-Pn}K6oab->E`lG>j4W z_||Ds@zS-qnWSvzH{`>taIS=>ka}6}652jmmR8P2qnXw?U z!US)Z)hL6Y$+tnO@7h{*hE{Cnf@EvP=3cuRjNkuil3i5xuyjyrtxBHK%yM2ShSpO8 zb{qqs29~36+0Gj+4OaEfvfM8I&D%;#DZ*a5n z8yDaZ=N9_8*6ttP*eQ?*j$U`W?o{#F<+#7fx!*yIuuW^l+$r7*V1`Zq5t$mot2t02 zpj6+mGSOdvP6^?X%sDc{+FxNFrknrhV|TW01_e((-1eog;y=>uds;uSN`Lj7EdY5R;(qaVzwR>|tvN|~0mhvsKP@48 z0I0YyXq>^w<@GRI*C&WO|W;~rC6`WEtTfavL|N9h0#ajhuFTaQ(J?_n;xy!NzQ+UWKniAdsVGOR zEym=hrt*LzSH{YjtYwmnC^+c95N_%JF>_9;#+eC+@^dl|t)z}BoV~-#+*rCVnl=QY zKiG0Fu#DWcrG(i@DQJs`08uT1>x`BeRy*Dp5^zEO9eLqHMNL5h;!cLjLi4) zF?8Eq7l+O<%0?vN$i-t-)+F7{WR?j~UA?13j%hpM?>F-n#NweL^q_%Syvy^+K{0jg zddKck!xEYAO0jL{)~HeqkjK*iwtckH82IL|x~m7@;Dy1yzLLh|u~FuDfg6AIUs!9} z?K4o0qy9A;C1(wMa3`(MosB;>fl#e8QFFYzyXP8a=j4#&t{~?Ryh(isN5@N7YY^`> zCQel;mkvuB@P=>`7mcI^cZ~lBXx0X7C@%l( zqKps6MqU!a*pJ<@m!A8MvTx8@7VEa5`~dF|-OGMuW@kArpTZFE?JDh;K6!}T-UCuRXD!6^YO#%td*E&leQXuLKgz7f>A1w zbsuAAv$z)M{`D{KNM5zY%%fSJiwF>np0=12=;yK9>#Z&@XP7TIfoSwS-$nI8y-nv< zHnYG3K>dyf-Ze5dskTxq%8k0hacX90!hU8`|7Zn@!eC{Y(d*qjtZS|Ew#26YS}3nR z2!L88oE>co1Av-$rTEhQ>uGzKxJu2?oY`&_00M?b1d@dGcIv2Vz{TEio{WVI^73RD zfuWOeni!E}Np4%X`F1|SZigN$5u z=Z?~56W%>ab5b^sxU`oJxvY4N1bY6JTW48S(VwiWGs^=r0LgQR8I zFB31I_1w;#i{#(nAJ)FJ_y8Qrcl)nCom&Jxtt$xe3ALrwowx1sEQ(j@dohf+p1raC z_7;Fe4liD?TXj`TG68pu1}vTP|Nh+_C4P{- zrhj+)lXMRApkFUZGj;Q?N2Ma)kHI>o3y42TCc@8lr>>;3+t03+*FE7IAzN=`o$H7= z6f}-{tXedi6f}YW$2Bh0mvi5_`q+)Fk2mxR9`#gPOZ^Vp$q|$e7AQ7iQxZk*fduBh z?PEo0Ws|hh)_zZ4i^G%1LC-=R{JK8z63px2^0Kkm4R0jtiStdPo73w}y=uHi6q3%a zB@i;vXd{x0WM9hd=Zy8>FLE6Gv`sX|rHzbMzkw$L>`?2!+<4dOVaY=VF26^S(u%E1 z`)#1}VO?@+5x!V;dodADStPf6E-Zh1KIA7)AEN96gmP6p;bQ-4|Kh4+^>9-(O@6iL zMwEe?eU%xsi|CTy$3#JtwtrU%n!@s$Ck?97i}6k-+O$#&7{)>F_nAH?wFbR4X)0Rk zsQ;6aQVpj3y=;;5dkPGc)urzBz@#|jFaC00?Wn^guT2BH_JL|-K11LW=R12Gtu(5; zaBVP4cEbGlvFD%W4uOeVV%0CeChk9>u=BtWx0Be6_w^(T^K}XCltvdO*g9)u&ZhTR ziT6__xOA}XfUc2Ra9*`t4oFayhse(Vp|g4%Kj!yP+_CRE#3Vny<{3?ZYuLJ#k+4@R zMj)u}fG)-Sa$W5D^cf712I=w!mVT!njmbENTkdI1(Q_F$!0CQqu`;Hxr?q)&_nk1& z-tXk*`)PeM;a6C7GAAegjoQm zDP>oYda0Slqgi#pKi7|tikl|}KI!U%z5HDM1hChK-cNX8FhHe{1s|;g9z+BZ;I~SY z&Q_3@)-UD8$z$CY2AYi5pJDUjY(Qf2VpT~Xe=X_18l2Mi4?ESvUT(b7-USecGy3Gn z>Xy3?z>*Y|K6U)X-c(j-B98~w?fn`#ZnOJgH;h0gk#&rmhsssP%MZ$HFxbCx z|BAn@%qFR;mM?G<+<52-PEyKCz4QEI?_W5Tg}Hil&*8#gwHH+i7J%Iig!pxOe9h3f z-d}t-?aH^CDs-FxL##rQ;VW?WpZ<{Ze8AM~hdaV7FVMW8v9^mB2PX5OqFDECZ#=(ntY(T$D=u~;Q3wcnTxo%!X_{xepFo1#n}<7j=s&{&e874XQDf13@U zxHLF7QXO@50qwkyS+$2YGNukuDQem=^l^R~bWYDr+*j3}eoziz&%Wxoi|;^67RwFo z9dW90a6V-a3Jre)IgZnfy!7@8!nL?q%4gZ%%G&B5X5??_v3eYYHZv&(1uw;B1L>8Po$?q|oOlNgV`Vh4z^;;mD_jM2{VT(%DD@RN|Uf$6~^epE`XPE3LBI zZZEPzuNyjl0U%xC``)H~xLdm^Fv8?nW3PK9_-|kvhWffekZO$1DzPJdV7H4;CX+l> z#(0sMPoF-`aT00 z7zl>b!~2#~;$Gis)T*TwOg4S{`7pnE+vO(8=;?0!deE2PVqga&$KQazEYnwlOqBTe z_*yFXGjyC8gX!;6?$uvhUzPa3uxoIfL-p0+@N_ly-b^Qx7Z$CF*@FQL-iP{EZB!wa z2+0h4iaSNX$g47#Z#WWRRRM`T0LK`WSQ&)JyY6@1#$dGArOjf68g}C z`(%U49W5p<5$*a=P7N*7=U6PZ$akRU;e>I?>oB|T@s*PZteh8>b9-OT6RUOhp?92<%hl_nsd(o4V! z0#c+!YE(pe?*s_yC>8?Jr6X01fb?Dz1!r#7M2)5Th=fmiS17wzC|g)+>2`!&6QZ*HcS>m< z;lV3^^%;C0eEM^cV7B#V2E9vMBCx8f0I2Mrf<`ZZ~bTxp1WuPrY-Nfny^Fn6;t@{?aTh zc2Ix)WdDi3i^jB$JR1buln(uH!KO_AMU1^RI!|Tgbfn^uh7;q9WR?naA>k`pEXi6vgrHe zwU#(*H*a|D_n^mNsi;YAwpRxg4YM2JLD|I=R95uEeBikbo;Cq|GWk%`%|&U6k;-dQ zi?0MVsErxnt%YZEO_y&v-j(c$XkcHPT|^4Qb_vfho8<+EE(B zO$bL63lRHSQw*pLd#o#>yr_@jAl616iWJ0nbVDw}$7XVvDZ>)AP%d$$yK|i%>52i< zx7+-G!sBltS5h`B-qF@n6C{2M-m`lkNslh}B8KtxvPs@OnYxl*fN-9=amkI|tH8k2 z$vJo^s&}w6ZE8vl1Wg=B+6Gqr+e$u-xiWF&jPHjV5sjvRbi3YMpYfNGFgrW&N<)*` zh=;6Hq5?9f;Qh2PdJ(lW$E9+2LLq-~#Bz`>x6L&Uz(@Q%Cd7vBD(+yDc(&kT)KK_^ z>%%uYYvpAtnN1>73aGERoWM_mh3`v2Aq5>S1kCmWuvF3_e~jL&;nY-E^Q)H%=hzC=D=!K=>sFtdJ=39s- zn~wlz>Ji|ouC^7*!RHMAsilp?rQ zGnU?FKpNrG-I|^aPmhdJ7u>rVWXs+DZ71bP6<{kg!wZ2kgzfV`XB3yQx?_X3UU=uOfsz7&x``nnz z=CEcrgB)Lg2x97MEubctTL__XK3uq)H@FBBQ<{-r3G-%L{;5vuz3AeFiF1eFDc%L~ z+q*6BjrhY$Vze1fLvo_cB&6wgu~mM+38OneYU*g_GHR0wKi~G#(3MoC>?FBG{GOHy z+)0L?2?qV-pmZvpQAcuOwn0)_SPK{=aIA;LeCJoQA8wbrOMbHbXey6bvv^1E5Q`S3 zF?Soz>oq`9-j32Eh57+n_$?H&mK5eo;dk#(fB4R&`kgvhb81_lf|{b>Cs7pHp)nyy zu&?dph<)cabT?~^ET#W&7duFkuuFRRa_x znD=kRT7-7KM1ODyXN$Y=+-gYvE1lmD5ax@7(S0g*++Q@U0#V=bB2r?Ql@+&f;n^xY zO7YLPKf96fPtqy({dL9=D>h(DYx+lr2M(6&Wc&p!I}R0VMfQtHMT$b`zV(_S;GA2@ z>F6v@bTI~={aVWOp+a0!3|PUy6JC(}=hhuNT_Djw6hor1DqmHhv#<52L;b_YTuX7P zhCO_-P}}ms4Xsn-rHNRb@!|MdB{RWNW9l$RD?&iZ~W+Q~I0<;S?sj`qilJkV>&!gh02mCP; z%f8W(k?#@`3<@~5L*ShRL3F%8>vz4SPD?QOw{-;48wX-->mTWg%vCYdEAg&=d(&*b z1mr;BwnqrFwBBB6*g72FSH{Z})2_2tn}7bZVJCo_gcNtqdM{gK?`psPwTD60lIEwy znw`L~aZ`TiSgHF6qm^#7r)HB1@1l9+EQ1gj**vDXoK8Gf(e0m;83Mvz0bdfeZP+g6 zyHV+Q5p$o*U@1rQi}!f$50<}^>XPGj_)(*Kg}I{VQkojN!Wc=8o|=Jo4OO}67h z!HkbmllvdP+Yhep1|Hf~(HvFEqlY1_F*VbinqQCKg_<<|>Kp_vtWePv_Wjcz^HtM< z^0r+}xiE@k!h!nx_-g0&>X_z(kW=zb%P}@=Qx$a|(8FT15UmMr|6D-Z=;lrT6gZUy zF3v+?r*PE(;JD*4vT#D{7{M`jbt`0DMh-OG+wNgtGJqN2LNZuUmjv;ZU`veGID6p^ z6>G_WO8`5KKDd|72(Zzkt&=Oxg*EGpUl%xyE0uBHyecT1^X6^`uL5`2;E|urT2c1f z2^ihW-&G(#42H5>HHI8z-D0`%(ELy~P==klC8HcoAk+BcNR=loxk%di(;tFDg7%GV zN}dDN$h*-$m5Zt?p(Cd59ta?@O&)dZt|$eY58WmFR)4&@fmUgflM))_r+BXm#E?btffUjO{^YF=TvT==v>UCMNyY;- zQ4#TVMBzR!KYUy`(o70keGW~`MI3!8{)H7G9-z6%NTrEP&O4dAy|zPtn}zHr4t&4D zZgn)^Ey&E+Wao|KDOdweVo{f2&-O%Aoh7wTGCCnvRD&AOo?~xo`%=ItRe9(qwYgaB zhHj1eU3@nW-UYxn^}TDmo6K2Sd^e}Ec!-ioy9=|?^I)(FR&nmrV61pZ`iR|T{S^*~ zYC6F4y9o{|Mqq^oA_C7mX^s;*fBvR=ICuYWhe}`VbC}|XI(;3RbaUr8eFGeCszrfM zxTx6ryTZHq35kinqVrGXAfqV8@jT!?ftHzXjUn4M)4`=PxNhS$kn+G0$PwJvt}*U* zNXUM^d>5CDe<-n*ptAGPB@O-i#<3t^a5srQ`TK)l+>iz@~45h60|Iv~cQ=%mSHvOSZV!+|||ht^OI!a@u|9s2ouc)kLGw$($cv>s_z% zafSm^ldvh{>{BSvOmKL{5UXGdX?RWHP=*NlTzEdia?Q)DrKP1`W&qvyY+OA?X-RZ6 zh~OAl`NL{qtYrM*VpK{>;1{kfVGQ>D_R75~$-qYJLsHY5-!Hxw#3FAL^6#!K90Zmt zZ|~r(6B*>UbDQ$-k{gxEIPF2y1-8`L0ECb~+1WWvKTE6-{xkhhuKao6h+5G(Xti^6_GyY$bVH&cMJo-PI^%f$N zH{18Y3?GY~5){8;i9ILb+8@|9SEo0-x%ibbSOhFQ{%gN8v=~|xmRaL={yg5Udb3@1 z?fD)njmnJMc~Bx#mA7MDPkb6^q^OLHHn6d~<@o4f**Dq;R?VDaCSBiTSGIVva`=FM z)Vn{xSGJ>4dNQu;ZE@z;d!k$N(3$T?x{vW9|0!}%77B_D&x9k4 zNIVDw5STF{cZVO&Q*c(?b&-$dJqCRBg_TWlRAWtZeylR;BOeW3skv??)zQxwEn3UYtZ4f*FBlrGJ83dXT zmgj{N1%a|lCc2Ul$WPLM%lH>a5~aPb-~Ht#Yx5-$z9I^TAlfI0&s($iAIHZm(^H#0 zdUybJTGfv|+w5E=A1k1a8vf~st3ON5JPsVg`sLK8zyb8s3}g=22TTI5*m`($K}W&qH?2zNHpjnQs_f5eha0!guRoA#}$L?xL-VA0SoZ z#;v@2f`lVq;UHD%w=}uGcyRgDxKsoCj}4j?G#qsQ(>zg)JotaRg2i=8jl8v>(E7zH z*Y@)=XU)!b^!}cuvXlt`q~>Z<=CX+r`se80OZv?9GZ%pE08E!*PI(So)oiP>z{HWM zp-NRW>GTJyABE6<5Adp;RlwG6l`(^2&DX#3h!S2p96o~sfj~A_-iZDld*4Y!jPIJO z0$xInLg)*;f1iVr5If%tZo30JFKtZA1mOzS?m&xD=Vy8L=Cv zykMj`JdS9VXZvOd^c{h>KZhA!5)Ap{_6@@%BBJ-&Kbh~r}}gK zF^V-m!Xam{`S^-9fvx-#pp`g9}_ne(cfJ{gI+{}m3n?QXV{e{NO{yj?~kSP56K z$^D?udD3Q)eX?%z6U|$t9zio2U?mr8)A#9jLJIBx{{zxxnOc&8weor>mxXhQGj-7O zU}dwnP_u$>^g;J0XWYKs7Tn7%q^_3t@JQ8!7(N>s;AiI+-UC|-d*UabD&O1OGxf%L zJOp?m*v=mvM5I4~2fYhb4>|+1=2*wrh2($sd>G*soY)&9Ih>at$+N3f!LzvV{+OiLd5zlc+}+Vm5p|ARhCO~dMA+o}aMbQTBN1~%uIs1<$Pm#l&od>u>Wxi3*;DIs8GBL?U2Br8#D%L6R? zRJ;0zIf7;CfH>sLWCpcH#EKB=PXY3K)`oaM&|K!d$HQA;e>|Sk5jBVBUT+WqY`GO) zc`br!e=T8FVl&(BI451EK}NXO)Z=olnep|=$VT)0&o`r@8EB?@*s3F?wX_9MX#`U1 zp7+9=NUhggy4-X}6ztm4wiCyKTVKjk_Lo#Mv;gJ?i=FNE)kL=*6{APwSc~7v%pO2U zC->R_9fIRMl`M5@*Nza;Q$BB!cCfd`OI`JrAMrcSotJOCw4_4u&V!fNnwFA3^?WKg z{N}82TH!5A4bTF}av?{@b1khcikTw>QO);3K58?|#DRiL8BR@Ez zUVJJMK9ZNOpIK}AntqMMnWtY)j6R*)p50URRJy+fH-`>TvKGK57IFnFW> zZ#PLXPIDuVxq&qWISkxOz64mv+nbfsW>04~zl9JW`yCk?oZd@Jhelrm_}ySzYw7 zqW_AhxK}3K3NO~EP1lah{0F1n?A3lXYh>-|g;Xl% z&UNRw{Cgg_!=$djCk}2m3BPbCSnFG}m|mKDnP(-0EA=m@d>Ca=)EBsB-%ztu^*`h8 zDb9cp{5`>m{dQG{iRH(LzVBCq&q8u+XqI(-T;%cGyIz0a{7-9ryZek=3mdXmkTFZm zJM0zwE}D{4qNk0!r=MwZ1=i@_S2?MW>~!dBmf55jUZ{$LfyzQy{S=vtJ}j+Vd2Ltr z6*e|CKULH02@?doACQl_)#HyHbQ5$GLt>JIz*ZksyriG=;1C+$n$IA@r?m&z1X?k-iU~K+3>w{!RM&$$i}nX zj~@;f`bBv!jyNlBXPr(P9K66TI+JjsZ?&;bOwbz2vkSf>j$xkN83-vEFG*NN=kgBN z*zK(QqHf;~fU(rSj6DaEGlf_X!7I=jKPW3cqL<}L2e=S+Mz2=;dnLdHdt|i??_-B> zOv!q=sT}IGh9);m1Bg5*2*Etr6nq0Lymh%OHfhb)9;2$wWfq$Sh_?Xn zk7khZMq|Y@33AM!npF(Kc79`5LV!Vv3eEHJ1*sxwhjsI0`5?obcaodJ*S5)&=Oi{! z9MR=3au7uA*ro+R{5|I>et_|2*56P0cuX!97~uKXN3>1x_8P%h$7r z*%UOxWxpglN+l07AxCoI**TzZ=(oG&w`?k7>uZnq^S&_z8RB`o(zhhawD{FR^{lQu z@^+StZe8d{8)VyWEJc9$&Q|;5K1w;|RbworfM%Vx4lskate1%*yY{>@qrTs?jzfKq zdkK59aKz%wgNBN=^9u_xPl% zFvuAM$=V>WOIozd&rU;_=+>oC@te15lO3uUf3!wQ`8);6x)`S7e;XI{{hyJK?)N$L zH#{>=11OL)6f-mvMEJe_1aiYNYc)&j`r0@j^Bz&GhQDq=_7zTPn>6p3;F7wTHG2o5%=PzIWnn!j0o+9uF5)s(p@X05Vp zwNpz@?1zI9(7*~8@?-fO(mw5zDNMA#2gY3=rRhB>v2zbxbWo39>F|8O33Xc8RSiw| zlE5ovt23xxN2P_bTp=LAEKgI&cOC>*Gh)x@%RqFwQr~!cKwjeqsbHZ%VpwUXz_?v45 z$c{g92A^HexZ6-r^Ge)g78IZswCmm{cRdo=mIJ+;Gm)7wsR3`gf1LjRHzVB0-gfy1 zKG{mN2cAYy1cTq)!#r1}sjqUORI z@{vHZf^Bi6S~$D~Ui&&UCn&u>F=vablsH{T$wpC9bu&4pq9()Rqfw395`_h- z0y9NMIe_>UTbj+zO+eob(i{^7L{8Z}ja1XsBel_DD4)ZR$Q$Ne95M!d6LC%Z?CL0& zEM@0-{+Bt2$#f9b^1k(&{|E>Iu(5^i9^f``Xg^=#Y;sD08$#QI>S1sw+`7wd#$H_9 zFwODB?~}O0Q0foT4%*Nm5%$Y=`^F8J9!0B^)valZ(|_+2^%2vnFdH+<7dgcb$KE_N zQ8A;l@77ZBCz&RYjq&axMV3N#l(RtI`8704)*y%7h@1%Wub_Ux_sAvb`!;b=eBMV0 z2!mHoNtjo$MOB{p{dZgQ@WZX{>bcLi?c^|P@}8$1kI zKjUi~zB-gxsNX#aV3_D8C*s67RA`nkDLHx?F(XT9Ez@|NR-q^K^TajtP~@=rPEE*6 zXS*o?j`ije}03{BRQYP$sV*Hi;tTi9m(^+PNa1$S-a{+|}bn9mTWc zc^ZDXi7e(B0A?E|(kwmz_!+m%rM%`c%sPeHUv!?3C|&BL_Ok`oSzh7(*8Nmy3kusR z;x`1YcARwi+GZ^;b5cntR7og|=hwrgzkx9IR+1CQW!q^ID_9j6QXp=&|CbcM6aZcX z5Yoh4{NfCZ10Z~nir!qUDpGc5|J;6Na5(|6Qim=m0SUa{{T?LEg*~%kSNheaNC-;= zL25XdpSrn0yOCwsuQ$KK?j)QR*WR6~Yzr+CHuxmTYg+JNOJZjW~q5Fcjk*QEtsiTo% znd2En0A`IB1+T10hv{2^H`&f$O4nl)3g#wP0|LsY_1M^s?bs2Q-M{5Sx*j=9Dp4rV zjycbE(PVE=&#f$$T^QZ6XW9QpnPttVkKBA=`Z`j%l!@bzQlP&ms<`&q! z6tHtZ#88dnvO%v-z*w^tETG{;N$_+AH4s3aT4+HJlB-PMI2?wStexmSYvOMqk)Xnl zXA)I~G=y|hB3&3=se3E&k5v6n=GRa)|2_q2kBi?;RZ;4d`-!^b*MZkUerKycrnJ`G ztKrXyZqmwH9ur6b)u(2IZi%`?2Wd10(R$h}Ht8M->H8X>bi+hjU z__*rn6K?Gb-J|oc{Q{=Dg7Q{cG5iP**nzQgTJkJ!84Mi)RXa?=8vc04oOpLwEBA;*m^ap6TZnu?`EY!EEhGlOZG z<7)am;oD2&qrF&vcC7_iv1~a;T<}$vmmt_J-@ohq4b$q8thc|hT_k8vw);EV9zK2Uo7-h=V@9 zmi6fJ13w$2Wlg$fSG7#+EvtkSy-nKor&UYVW8S*>iK6}0yIzCYm>1Q!vOO*cNOn9D zwG6;$D#m<-p)C@DG6WlX?}>9tYPMGIR9GI~!@|nP>G|E|UACEmbg{4FpTESJCkSfg zw_fY9nV{k6P0+Er?H1(sEk7LMvN3b_WSvG{woCf$fc7HPZ|FH7;;H>M&!GX_bB%un zA)IF@YIj^0hF-L+P?QrlOHtF+-OsIj&Xx8)3o)46P~omI7ABA zUO~v>OzG&+g+*v)L1%CrIV1peG3iR~K)@-Og>ZKXs4W8|=G*12>!Os*9Jki`-6Z)B z%;GOUf=ZeV+)4Lf8v2X#HzIGuD_XbxfK*BFN>*;5wvHo^7^n@`MQ7&h%x4zt%#Yi^ z(CV1;&jX$R9cy!*+RFZ)SPN4Vjp>ce*C8O7F7X$f8egdf{@tN*{@<|f_byXiE?7q8 zTm&dR)$S2SNNH?P7;`(@W7BpcvKTssOi?i`dD(4^y6oxgy>}B9NS*hH`zs;AJTAmM z?vXO|d+Yn>>+s}ZQlFjQN=$%xeb(EY8;KEC>Kx&el?&_t_Sh|my#*i^EbEBa<=!4& zd6yc>{k#fqJLhUUllyH+3a+dj9OhpET51zm8v7fk^qU+v>wqhXM2w;P#XKUW?j0or<{DSua9wr6`c6?35aVTX+W!E0*5_Zi!aQ$p3ZaNkgF$z}2i3%S-`2emlErbPO&UQ>!^{82Mz2 zu-ST-tQ)z*$fALo`F(@omIt&+{6Z?JZL_V38_zKoOm{-_dp=J(pp%SC|X@ zJMZVe9lB!%vhekHyTCUf$RyKPKGApcGC2s-ALya4NXAcNPPfYUqj$}Or0tgD)tD;h1pVV z_YIQWZvrl7GixRey6?JQhU=|B&YE<8FIbEKCw0tdvq^&_Pp&mA>&E79SMv^X%-V6s zuyk>!BTxqA5JD10fb?%^rQoSP_vZBCwi;<+OH=`i727}cLs(wi(JO{_>v|>C{uj&<}@7dX4ekCg+BQ1=YK&%^F-F~3t-XsEf#H+ zLzZ^dXhi9bzwOBu(n#^$?BZ4lkk0oV|#RsGCx69O7GHcfu0JcITG z8Ku-JY67Gn+LGl|eMXBE!}Dl%5ZnC_9uKJIF*T^$7l(`_sxIW>H+*I`C7BM84m=mD z(;LMfqUJTgpHYpE57_uld&H2qraS&$80<#cP9nsdi>`K#Y}3$+Ej|i-%H}XIP5Ajep|?edPcQEk#6fA*xoX zBLSeC)Mmk&os*MxmT5cf7g8SU?5`D4XAto$0xP&QlhTOJ)IW}oX-t$=jxu#}cdnsh zrMX~!Gmi;{fw&gWw}kzJ^2RBAbgFkha`jwf7w(-B<6whAaz#&i4}*| zF&o=PbpQIV6?f(tkZ{KHar+Al~F{F1;<0zZPG8*J)M)RQ0PrM$POl z_c0US<|DRhho&rJccoT{t}S#Ng=9yNq><%@(zV)Jx_VEcJC~_gK!6q9mgD~u67Jrx zERapcrLfkg=9B>pt!uFb_>GO3VlLPDV?1k0GFa?6UK89BB7lrlT|T7E3x6zsjO z0t(-6LD2J?4v6GRh#Bbxx4ez{vTvKmwUvx|`c#gMCKEY;Dg$Gu`KB(%jZ2|qD+qN= z3~)08JSeVp2h?WP-vL9@j)rZo+4F|Uiu_J;BPm#MsP`AoKbhGky^le^Je~bS6^2-v zFxn86NxGv@Tcy0PceNpFibuf|Z!=rU z04N?jYqkcQ18KK`)&T(OV9&aaU|~iZ?k#f?h0shhuk2HKe&MzvJ9Z*>pj0@yse283 zf;D%|YsSZZ+7tzbK#wKkWLZ|s>a5v0os8`%Px3irst?pAHWyUc`-6>5$K;%j{#&4Y zx4i%a?c6|Xo%!K}#x9QMz}RQ|6R{Afv`T<@{uTdd$d>Hl|nkv z5W4EBsD_nmmYd=B^Uf`kzPv5fZf+iBxgOY5Sj?}xJd14FH(u3S4o;xSLmFEzmuU6$ zd0j{ZXR%DhS)SSAEsYh!B$=5JD$ChXe;Z7&m|b*M&hj>MwP}#jy+45EF{$u(n!+Z+ zx9rJK4@iZ(;8?(WZcqeVR0Bhw7_ZG){y#`6534ZU_$}PNvK(5&jv18=ZwR>RZv#c= zEOI5w&50D9q->%a*{h@!C18-PqcA=$bmP^l($eNf&PsHbM#%~ZjtU8OKj`2;c4-cN+F{^{yXvOye@crl19K{!#vh9f!N3ayl?c=9e*vYR-iZ5 z-5nVl8+)m&M6p8ir$gX>+wmEz70$U?YuQyj^juV&MwID`u&L_f9kj;V|8g}1{02S5 zqtrIQRChe~!I25KdEcgj8>#1|G`fd}V+CfW<-Hr5yu7@!s%R7S_}tu*-npg@-Ivlw z{_mb$m`s=ErMf5-5Z2Q962-3Q$^88zJ^%>2CkV#jvp>T?1&KGHP&C2s}-67caR1iawuoGdgvpch-~75wMSp)HIB zFE!r-P~BRt;IC+1#ABcZ#$y={MseEUw52@D0H-{QLg@~06vU_tu+56|%M}JjU9GZp zk`s0;@_e-lS5A7wjz6(FcwEZHdUCd;Vj>bO=DwI*Gg-onFrRMg=VvA*{!T~1aXv!D z#rGByk%hz@j%>@tvv)aXqyig5&(?a|L61O@<(LSaq&MM;@E72y-?C9R8?Zw#IYT{s zDn2KrZ7$!L?^u4HJ!KS6yRVa^9Kj@|*2?r(HQGu1Z`b5;MgXkudQ(FmIADoZN5woM zG8bIveqlT`-?sG^AKx7ky4RK7F*TeuFxkMNa_lQ19y>76*3@7Gm(-!Pm)%>RSD>sg zmlm5m>o$sCTh>K&wf8mfa3B~lhz=t-LTb8}k6SUij)8Fr9|~HwyHXPr?w!X=^nE3R z^zI*_Wwj;xxP^Ifw@T^KmGhnP#-E8@1V_s{bwyqYgy%J)WrYx@g)|JgULE1ZLH|r! ze3;yBlN)rUro+;ozOQ1kU+IEdcjmnBLd@oT*V+t`$W=uD(Sw~TGOpVRPPTNYqu_>W zowPtz*roP1WBT1>&9;1f5Msab(|C6^%Qx)q|i|BMZ(fxR}d#-&C^h}O`FZ88u15(A$~ zF>+A#N@cF*GGB#RHDPhJodTkO&jtc8Mi(1))50&rD_d&@F%wa*?6VRyOB7wbh!jpl zB#u}v48|;>Y-}VMw^%KVS)|`(FkG1ao#Ts@HbwyHxq2$O%yQ84C}Z96+MPZ|3eFVNg2oo{i>4 zn7$G6Wd2kG$NtIh?5M~&RVF21hLL}-^hL79=uJ*D+MvkK#&Nov>N1;OQuP`(hT05Sq78bO6Gi3v8hi80zL3&V+gNIeGO;oWiE7zGIJyw`T?bufs*7$tNF|v zok(nF4;kwKPHBWqmrZ_~c-iQASDI_ZJ7WxmFNjQDX(<)=^X_@F`6ZPZVkjDO|E3fKQ*=UeDW2%lp zxDy@%+;2+6YBAba5HuV5wwjs2E$3O+>7&A*DUmM*LPTxc$fk4fhx-@lZc% zUV8=}L==6|xRYwF;*hKeADCM^g||VJ-oEs%PgB;(S5ZAYDEfp7%HXJF?bmd-2SHsO zrp@0f6g7t7t3l^Y@&`ILnEFYG)uR3x53k7grYm276Y?Y{!rdbi9?hfmoQ~e^3Tf7$az3$M7 z*<)$)HnbYs3#;a^f487Rzw@3?Dxz4fF4WY-G~{&jX}GuMmgVGBDd8z0by|ewam%{I zdLVDAD*n=Ze6R$8c-e*Ywp5fGuUTE*OS;uOFb~Lx^vbMIU;-t*vFRXMn0#=ZM$`l@ zYay^Q0}}1e4hfU+OdLu(avn$PPm{YObsyVO$Dq3iX_Pt!iMSAlVCUA6sHKp2MJLn! zyvi@Z>i1%J|04yCM&bYk%TL}x?+PWFSkXq+Vg+DgU1f_(Jc{{#YS$lM4(FQ1r9et0l@NfXnXIrlw=j1JQbw)cM z)2`qd?H+~x z60Rc6dgGtPs%1oIUI1Rv;p_bGB>qHF-wKmD@Dv*NqI|58L+vX8pynMc{l8Z{palf1 zW^B^&46l^Y4bQwP#>%5HTi8;~;>7FJ&2vRI9lRSdN89b*n8VgScaZuMk$)1QaOUPX zikS!kg>a%tpo^&)u5fe8Oh5VDDaqO;bI}-0(YNjB(?0^q`C>1d06K{BVXMNxF*=s~v z@$t2Xqc-RP8y`bVJQf4(?A$EnFkNkZK#J%p9zzd-Y(`dZrtdDfFPBi^|7QFy?YI7p-y9X3F;D5=a1T`4e|+_b@mSENpW z#(Dw173ke85hf$Cca0i2YhGjD&Ixt7x~Pt?#{R6 zD>aOsB=Dv~c?I=G6I(msMrz5EL<|`moRE{c>Bk#1tv0jDI23H7#DQ^(o|b= z9AJi%-yZDn^P-goxK2L;58AnNVITi-?K~l!q*vGA=JBzy&xYz;5T!1oNu{NwZShKS zsdY1ZfcMUyv4m%ssQC2t#e0LZ$cJ4Rn1}06BKG>!rr2kWzh2o`2AZm59?$eHbq)fD zsS5&mleh~%_VGGl?(GvL-Y_3e0S)hk!3a6>JQkDh*b3Cjg{;L$E$MJD{}~Fru_gIm z)z$ZdQ%_Qf<5xV6wVT7bmt84r(Z8RGtdP9v7wD}ib9^dpTmxagvsW!G$-#8?Dv*ySEBwjHFj z!1KyU9tytSMuC=wU@SK`*N^gr6I$38T*fw)*QcrG?#+T4{79ZK+GyRWmlWadh2!zDUNm#L4^%}3Q>-rX3ZOSdC*&rm9r)xl)448!NT;V0>R>-2ZmIZoLHGrbNSIr{WN2 zL>+^6HPn>psKjG@s@LuJuUbrbQbUhdEHd)%_dLm28LL{HAR0LU^ziay4597p;$J?F zlWbuR**`fRUc>GpltF*LHgPDNKq1HqYJl}7V^SJ$Eoil#e8IY<_YQ(-Cy_z7^vne4 zXjN~MHzk$OVY)bvmzy^ar0(ff2*(JhY9YK$5m7U3IR@PmJ7UN0U*w#y7rsF(&`4hsMKhj0KKqchLF+9Yle3uo=Ej^GXwAmCEmyhDEDY|G|I_Lma{@E=_9bbY~-Adt^3|0_plfFFL17W zq18d^thIrIArH8#bhm+ia0H7T>&7b!lE-{dD)OsA;FQ0`eda3RQy04D$Vn9*>{GKl za#qDu>4EE1FOI2Lv&FAQ181@8U{Cd=bzQKF8h>(r4z@2R1%pmW@$~fE_&B!nemS{6 z2bD*x)30x?O_@;N&!F0?hhqtW$%W$6CyicTEp1SusTL|1YzP*6+76EWnk!_Ko)VhHjrH2s~NF zD9LeypWzAc=`$}FYj?JS7~n5K5F~v6bJI%NKU=Xv=u-unqIS~VWv>5v(~xV%;yh9O z+;&%vYtQd1Bz<03P`5oR&Zd7D5Rps(?38C}KSZ^!$M;)8A39)`tG}^TW$eA%aXIG^KbMhmH$siu zcw;iT5q-jE?8LwS)0$URow@jBg;SR6xMdbOs1YsqWrb_|6UzlBT>8sHPskCg!GAU? z{^MU`=7hkKu4$gH=gh_%6KDL;KR-T*mUA%w`NYkU|M-_n;Ytu=^D%m>!)$t*ecz2= zIsLaUtq(k4J6J?5@Q086(c$p3Z%xkCCgT^JN6J^m%H75Z|M4&19&l2Rs#W`u+uw`+ Rse&G Date: Fri, 28 Jan 2022 13:51:32 +0300 Subject: [PATCH 3/4] fix --- case-study.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/case-study.md b/case-study.md index 8c0511d..8d08353 100644 --- a/case-study.md +++ b/case-study.md @@ -198,7 +198,7 @@ AccountNotificationsService (./spec/services/account_notifications_service_spec. Google::PageS...::QuotaChecker (./spec/services/google/page_speed/quota_checker_spec.rb:5) – 00:00.360 of 00:00.379 (4) ``` -Добавил `parallel_tests`, сделал пару запусков и не получил ускорения прогона тестов значения +-2 сек. от времени запуска в 1 поток. +Добавил `parallel_tests`, сделал пару запусков и не получил ускорения прогона тестов, +-2 сек. от времени запуска в 1 поток. ## Итого - Настроил систему мониторинга DX метрик From 131ff6ca871d2682925830fc3a6145a06bb8466a Mon Sep 17 00:00:00 2001 From: OrdinaryMagic Date: Tue, 8 Feb 2022 15:01:12 +0300 Subject: [PATCH 4/4] Update case-study.md --- case-study.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/case-study.md b/case-study.md index 8d08353..c501123 100644 --- a/case-study.md +++ b/case-study.md @@ -117,7 +117,7 @@ Top 10 slowest example groups: 0.09044 seconds average (0.54262 seconds / 6 examples) ./spec/services/favicon/notifier_spec.rb:5 ``` -Есть точка роста `8.64 seconds ./spec/policies/domain_policy_spec.rb:24`, обноружил ошибку, с созданием большого кол-во объектов, хотя для теста это абсолютно не нужно делать +Есть точка роста `8.64 seconds ./spec/policies/domain_policy_spec.rb:24`, обнаружил ошибку, с созданием большого кол-во объектов, хотя для теста это абсолютно не нужно делать Внес изменения: ``` @@ -203,4 +203,4 @@ Google::PageS...::QuotaChecker (./spec/services/google/page_speed/quota_checker_ ## Итого - Настроил систему мониторинга DX метрик - Уменьшил время прогона с 72 сек. до 20сек. -![1](1.png) \ No newline at end of file +![1](1.png)