From ee592fa28403d1fb7c713b2e2d76ae25322fa21c Mon Sep 17 00:00:00 2001 From: markxu Date: Sun, 10 Nov 2024 21:08:49 +0800 Subject: [PATCH] update_readme --- README.md | 137 ++++++++++++++++++++++++++++---------- asserts/wx_qrcode_pub.jpg | Bin 0 -> 28319 bytes 2 files changed, 100 insertions(+), 37 deletions(-) create mode 100644 asserts/wx_qrcode_pub.jpg diff --git a/README.md b/README.md index b3169a7..6049bb3 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,20 @@ -TG交流群:https://t.me/+JduuWfhSEPdlNDk1 +# 交流群 -- QQ交流群1群(已满):692635772 -- QQ交流群2群(已满):785620313 -- QQ交流群3群:316239544 +**Telegram** +- TG交流群:https://t.me/+JduuWfhSEPdlNDk1 -**Feature:** -1. 支持Linux/AMD64、支持Linux/ARM64 -2. Docker 容器化部署 -3. 支持URL下载planet、moon配置 -4. 可作为Moon或者Planet的搭建 +**QQ Group** +- 1群(已满):692635772 +- 2群(已满):785620313 +- 3群:316239544 +# 功能特性 +- ✅ 支持 Linux/AMD64、Linux/ARM64 架构 +- 🐳 Docker 容器化部署 +- 📥 支持 URL 下载 planet、moon 配置 +- 🌐 可作为 Moon 或 Planet 服务器搭建 + +# 目录 - [0: 广告](#0-广告) - [1:ZeroTier 介绍](#1zerotier-介绍) - [2:为什么要自建PLANET 服务器](#2为什么要自建planet-服务器) @@ -55,48 +60,86 @@ TG交流群:https://t.me/+JduuWfhSEPdlNDk1 - [鸣谢](#鸣谢) # 0: 广告 -**不想自己搭建?** +**寻找便捷的解决方案?** -可以加QQ群后联系群主按月购买现成服务,或者添加tg: [https://t.me/uxkram](https://t.me/uxkram) - -可免费试用3天,年付99¥。最大300Mbit带宽,单月转发流量限制100G,p2p打通后流量不计费,流量超出后10¥可购买100G - -线路为宁波电信 +我们提供专业的托管服务: +- 免费试用3天 +- 年费仅需99¥ +- 高速带宽:300Mbit +- 流量政策: + - 每月100G转发流量 + - P2P连接后不计流量 + - 超出后每10元100G +- 优质线路:宁波电信机房 +- 联系方式: + - Telegram:[https://t.me/uxkram](https://t.me/uxkram) + - 或加入QQ群咨询群主 测速图如下: 图片名称 + +微信公众号:欢迎关注公众号获取最新动态和技术分享 + +图片名称 + # 1:ZeroTier 介绍 -`ZeroTier` 这一类 P2P VPN 是在互联网的基础上将自己的所有设备组成一个私有的网络,可以理解为互联网连接的局域网。最常见的场景就是在公司可以用手机直接访问家里的 NAS,而且是点对点直连,数据传输并不经由第三方服务器中转。 +`ZeroTier` 是一款强大的 P2P VPN 工具,它能让你在互联网上搭建属于自己的虚拟局域网。通过它,你可以轻松实现远程访问家中设备的需求 - 比如在公司用手机直接访问家里的 NAS。最重要的是,设备之间是点对点直连的,无需经过中转服务器,既保证了速度,又提升了安全性。 -Zerotier 在多设备之间建立了一个 `Peer to Peer VPN(P2PVPN)` 连接,如:在笔记本电脑、台式机、嵌入式设备、云资源和应用。这些设备只需要通过 `ZeroTier One` ( `ZeroTier` 的客户端) 在不同设备之间建立直接连接,即使它们位于 `NAT` 之后。连接到虚拟 LAN 的任何计算机和设备通常通过 `NAT` 或路由器设备与 `Internet` 连接,`ZeroTier One` 使用 `STUN` 和隧道来建立 `NAT` 后设备之间的 VPN 直连。 +它的工作原理是这样的:通过 `ZeroTier One` 客户端,在不同设备(如笔记本、手机、服务器等)之间建立 P2P 连接,即使这些设备都在 NAT 后面也没问题。它使用了 STUN 等技术,可以穿透大多数类型的 NAT,实现设备间的直接通信。如果实在无法直连,才会通过中转服务器进行通信。 -简单一点说,`Zerotier` 就是通过 `P2P` 等方式实现形如交换机或路由器上 `LAN` 设备的内网互联。 +简单来说,`ZeroTier` 就像是一个跨越互联网的"虚拟交换机",让分布在世界各地的设备,都能像在同一个局域网内一样方便地相互访问。 ![zerotier](asserts/zerotier-network.png) -**专有名词** +**ZeroTier 网络中的关键概念** -`PLANET` `:行星服务器,Zerotier` 根服务器 +`PLANET`(行星服务器):ZeroTier 网络的核心根服务器,负责网络发现和初始连接。相当于整个网络的"中枢"。 -`MOON` :卫星服务器,用户自建的私有根服务器,起到代理加速的作用 +`MOON`(卫星服务器):用户可以自建的私有根服务器。它可以作为区域性的代理节点,帮助就近的设备更快地建立连接,提升网络性能。 -`LEAF` :网络客户端,就是每台连接到网络节点。 +`LEAF`(叶子节点):所有接入 ZeroTier 网络的终端设备,如电脑、手机、服务器等。这些设备通过 PLANET 和 MOON 的协调来相互发现和通信。 -我们本次搭建的就是 `PLANET` 行星服务器 +本教程将指导您搭建一个私有的 PLANET 服务器,让您完全掌控自己的 ZeroTier 网络。 # 2:为什么要自建PLANET 服务器 -简单来讲就是官方的服务器在海外,我们连接的时候会存在不稳定的情况 +自建 PLANET 服务器有以下几个重要原因: + +1. 提升网络稳定性:官方服务器位于海外,国内用户访问延迟高且不稳定。自建服务器可以大幅提升连接质量。 + +2. 加快连接速度:本地化的 PLANET 服务器可以更快地帮助设备建立 P2P 连接。 + +3. 增强网络控制:自建服务器让您完全掌控网络配置,可以根据需求进行优化调整。 + +4. 提高安全性:私有化部署意味着网络流量不经过第三方服务器,更加安全可靠。 + +5. 降低依赖:避免因官方服务器故障或网络波动影响您的业务正常运行。 # 3:开始安装 -## 3.1:准备条件 -- 具有公网 `ip` 的服务器(需要开放 3443/tcp 端口,9994/tcp 端口,9994/udp 端口)[这里的9994需要你根据实际情况替换] -- 安装 `docker`、`git`, -- 建议使用新版系统,如Debian12、Ubuntu20+,Rocky等 +## 3.1:环境准备 +在开始安装之前,请确保您的服务器满足以下条件: + +- 服务器要求: + - 拥有公网IP地址 + - 需开放以下端口: + - 3443/tcp (管理面板,根据实际情况调整) + - 9994/tcp (ZeroTier通信,根据实际情况调整) + - 9994/udp (ZeroTier通信,根据实际情况调整) + +- 软件依赖: + - Docker (容器运行环境) + - Git (获取项目代码) + +- 系统要求: + - 推荐使用较新的Linux发行版: + - Debian 12 + - Ubuntu 20.04+ + - Rocky Linux + - 其他同类系统 ### 3.1.1 安装git ```bash @@ -175,15 +218,19 @@ cd docker-zerotier-planet 当您看到类似如下字样时,表示安装成功 + ![install-finish](./asserts/install_finish.png) ## 3.4 下载 `planet` 文件 -脚本运行完成后,会在 `./data/zerotier/dist` 目录下有个 `planet`和`moon` 文件 +脚本运行完成后,会在 `./data/zerotier/dist` 目录下生成 `planet` 和 `moon` 配置文件。 -可以直接访问安装完成后的url下载,也可以用scp等其他方式下载 +您可以通过以下两种方式获取这些文件: -下载文件备用 +1. 通过安装完成后提供的URL直接下载 +2. 使用scp或其他文件传输工具从服务器下载 + +请妥善保存这些文件,后续配置客户端时会用到。 ## 3.5 新建网络 访问 `http://ip:3443` 进入controller页面 @@ -195,9 +242,11 @@ cd docker-zerotier-planet 默认密码为:`password` ### 3.5.1 创建网络 -进入后创建一个网络,可以得到一个网络ID +登录后点击"Networks"菜单,然后点击"Add Network"按钮创建新网络。 -创建网络,输入名称 +在创建网络页面中,输入一个便于识别的网络名称,其他选项可保持默认。点击"Create Network"按钮完成创建。 + +创建成功后系统会自动生成一个网络ID,这个ID在后续客户端配置时会用到,请记录下来。 ![ui](asserts/ztncui_create_net.png) @@ -213,7 +262,11 @@ cd docker-zerotier-planet ![ip_addr](./asserts/network_addr.png) # 4.客户端配置 -客户端主要为Windows, Mac, Linux, Android +ZeroTier 支持多种主流操作系统的客户端,包括: +- Windows +- macOS +- Linux +- Android ## 4.1 Windows 配置 首先去zerotier官网下载一个zerotier客户端 @@ -294,10 +347,13 @@ PS C:\Windows\system32> 6. 管理后台同意加入请求 7. `zerotier-cli peers` 可以看到` planet` 角色 -# 参考链接 -[zerotier-虚拟局域网详解](https://www.glimmer.ltd/2021/3299983056/) +## 4.6 iOS 客户端配置 +方案一: +越狱后安装ZeroTie,然后替换`planet`文件 + +方案二: +使用Wireguard接入到ZeroTier网络 -[五分钟自建 ZeroTier 的 Planet/Controller](https://v2ex.com/t/799623) # 5. 管理面板SSL配置 管理面板的SSL支持需要自行配置,参考Nginx配置如下: @@ -480,3 +536,10 @@ services: - 王小新 - 匿名 + +# 参考链接 +[ZeroTier-虚拟局域网详解](https://www.glimmer.ltd/2021/3299983056/) + +[五分钟自建 ZeroTier 的 Planet/Controller](https://v2ex.com/t/799623) + + diff --git a/asserts/wx_qrcode_pub.jpg b/asserts/wx_qrcode_pub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..949c19cb1f1400fbe08a8ecff690661ef10d6b13 GIT binary patch literal 28319 zcmd6Qdt6NU|Nlt{-B3wNV~G$#$fccQ*OFU82w@Ng(FiGanj@DIsZE>Kb*x(yJGu#_ zQ=%xEb?qiojkGdTGsQGDGiQFU_n9J>&*%HGfBp9Ju@AeOnK|dY->>)U^}LO?SX+U0 zpE+&DG)zwq!}Q>Pn6?a?g6VhYfc_7Eb%g(S>e8uG$Bv!485nf#V${vZ$grECp|MHN z?#3oPObiXX_v+rm%-q7l!pPLJcQ5naJTEV|l|g?$^U=Xke|8!0b7Ho|{Kqmor`22cbnVv5vbR;A zfrIP^4;eaU>^SG~6DCgiW$HB7=`&_}ELgb6bMca;-fPybW3S(^aocwP9RYzmckSJ` zKP2=(*uf*wzsDSn{o~m2v**rVxEOcoa(q&9O6v8r8#iy=$+>$kH}C#~{3lPJJ%3SD zTvA$DC4OD~rskiwwep6>_a78Z%H|eyU3!?l?y}(Tx(oZ_x_ZEMb?DepzoP-VF1-!` z@Jqi($4)fH0Ec?PTe%=(WG?qdFP)SrpjT?aVLmszad`nX#!yD^mm<>=DrEBoIr zY|p>CvX2+`>AFfWBYi!1c=|ms9MgE5JvbOU8$D*-?p_CHKR%8v9pW@?DmL8w*o8A4 z4i0geY&dn$`bY53^U)6shJV-o*UZsBuGd?C{*l$0POUG|`d@!*7_z~1CZ^u4xs7x1 z2(lC5!{{66oPBx%l`DI7LcvHXA=WH*uWmlttAP{_GpcbMaC)(Lybb1%g;)L~N~zbF z3)N>f5bDFTv{)xsEfy_Np3q`jgqpFXo^||tjt6cVxi}FPs#Tlcth|7E!HrWA$!j$4WJIPskviF zYMS7=H@wYM%^%s>%A?z~*h*s$Ef#edJ_?!4(3t0Fu|4#^xuoBaK-nHv&Cz0yXKS(i z&aqnT{_`d+rtWz{aaMUsHIumWSc~nCtl}uAlZiwUl}!cv_`Gfw`849semRj`?b?)l zIK$hXdA0Sj%vvvN;!@9iQZ~hww8rbYYO%EUdJm{q{4{c5X{E*X9a337P!TOb zR|U~EJ5RG(nmu-KFEi`>(oU{nH@PdiDVJ9fd$d?mKyZe&c({|w`tEUdS!U5%#eq1u z995V{P1rG$`MMEb4_#HPV zD!r8_sGg1zmV~@UoLO4h%nT@1i$3%iBx#`|r+Z_~lBCV}BEK@dTF+>-Ad(+jLvn>`B=kQjLnh zE7zXXV#WFkwAky7N`1w7O)S%%SIX#{;U%-!tCaT;^q^na; zG&#?|H+u8&R|}f|X8TTCuxB#9alN3%3m(;UpvAs-HR{28&y(ZX1bXk$GT%7O z;VL&LcyD+-9?iV9nhf`bnO8!G42W1Do?x@vr$HY*m^mf}cMEZe9$j^K@mef<9z3AC z6x^VfPFifv(U^ufb@%&X%5v3@1`2yh^tS=jfzOK5xvwjZN>A>pc(1gOvGSJk_j1>Y z_nr%kc5BFd4!f0r-TKRsIH9>w=#c)ly~X3l_d8hqzg4nlM9yP!gQ#T)zj^W#E!NzJ z+{o)pJ>we@8*pi&Ong@)iy~GxGdNmo@~zYcZoLx}1y)aAVT^rw;kd@|a0)6deSs=w z>jk>)_+3w>nQA^)5B-|HYyK14-}RK8zAoyuacT<&HQS?#t;xaP*KANb zJw*_MSA@V0za!CNH|QH*d(o#MnX=|nw(eT2H!RpL?rH~t(hYyJmU>P-Q!z^Lr&>&0 z_8|13Na60NSuGW%pGtSPSMB1Vy3mb!!JH`L>~-0uIb3<$S%R-cb%9^dIBa+|aeA>; z;R;um#M~|8G0(s8RC~!yS)RgCX;#Gv=XX}aQs@$JH_|vLR^_mi`ukR<%DHsJS$caG z7}kYU!S)pInAW=k_M^MPN)r+)S*69grl}W+WPiXF%u+Zu@6&`zL~NC-#yOT(kC$2h zS`!(s6zs+;eix-$-mNe7pn65BhY@DPovE5bnplPDdqXdleW8kVj5=#q&L4{3KDk+J zHK7?c#`hitXH3uFYei6%)lTd@mXR8c>-~Si=VK@wOUWuPxHK(R!mXe9VlnzvY0R;<*oFjWq9R`XeRMXC_uZPJs>1UTY*Yq95>v{-?M7EAYO^s0)z=V+$h zAb%AncC^|^lrim|We8GNH23)F%}zf%sHO3HyY?|LXIr@(@o5P}^VV(@v_mOyt75Ok|HBUf*L{)dNkH%}Awb*qFx#ykwvZrD}HmAee)5bD(L}#=r9;t@MDyHtESjQYbJ5X0*P^?T# z4^drb;_JxZ6@!$pSPfmNp16dSOx#VTdcd*S{L25?T;i(ALz;IYz3!wm&+5LiW6jv6 zCP|uVo_dZZg*hpZT_MVKho|f<6Wt{@QqLdrvVFW2{N&OCf7AM_s}HUz8w-VMeBn!* z%l-JWh5V9VDBBsR>^#}< zPK(tI#Vea{XtCq=S}c~O#r!;V zQ95VeVk_{F_rhzMBL&i)!q%46;ZrAc#Y2G-EO4Ql!7?gf+&Ta%3|sLVz1KIgR90|nO&-il2fmpat)l|RI)UkFuu2&snK z)@OcdpXVCXe=wgnxfA;J!`oTYcg;1Zu>9hE;`y@otddCTAe5Qx&hT09Kd;79E!90^ zsXiWJL0IMhs5;Q-?%SsFk&yD?@H;}f!adr@obitL4BA{@)j8|L!qHp-Wdkc=VX_t* z?oLV1n8uS|wbZb2&r%PG_a3HHm$B~9i^mX^xvURfcmp){b)|Uwf52*?BV&~bD?D@g za15_N+sXu5fLXd?OF|P?FGa=H;!{I61n#sGl!pDSxBA>?A4w2Ttl}55sov?78Ao}Q ztQ-Z`5-VXfc7r}UQ>ch+;f&C{BCd~X5@L)P{{MX>#eDll1^k~ks_onn|BvU+^bSO} z5&7mi@zM-#%DZX~T7rDGZVCSNB=fQXWpf+ueJIt-U6ZB7l1X?9GW$o3Oc9kUa!{sm zNeuRt4Ow}CIZ=6{3WuFLfGlI7oy#eup1*D$mk2v|HJtA0b>Y5w;~!ux2?{T|t-Pnj z`er!Eqs8{nSDGj}m4Z}a<2z_8(YZBzZE9%KxTFH7y5m)L&E3U2=9u^V(L+(A#STZq zvVl))RISAhcArAE5aEc7L%20iI=9TNh(~6 zb>NDeq*_d}xq&0vktn^d_i0r&2=Q(R<-mXw!?tS?K7s zZ?+NdFzMZ$xlnTynrC5{D3QqH7^&ANA5`*{Q!=fUK2lcct)en1C-afw(2~uoG>@(% zJyc!15yt#we0lW#j*&6MMm&O$Jt6vX-Q)~accpGM3{$a6Gx&pE48~tb+)5hKf*v0( zuCc;NGL?~)t(u|kCU?%^OA{+aQUSE>cZCxE#s=<*OHid2-iA)PtSQ8qeRAb)hCaR# z55ZITielw9-QdZMOw(d#mM?{A=vXz;zV9Y1pn_k55jco%M$nZeeP&AnE~{1(k5@QT=x>_n6qZDw=8YV!`(&$2dki&pCKj@{H zGyc9Xi}7)#Fut`?_@A#7U(HKtDetl-gjgj|dYdZUlEob5Y@%|Y%2IuYm!se$YtB(8 z3djJy^ziM*ECa9a>$TMjmFHBQ)b#lV@Pw0WJbk_aIzbhoZgAlA=+_5#z|d~c&F|z% z%*`Lp22L}R41-SY5}P_P+@V&W^d*!#akY1>`UhP07g;$*iyezqd8#}l#2Pr8wOAx) z5W|Tmfg5osjaRor+K+*8O*BU-d+G^ZhHjb@+%!{#W3)moDn&!_G1zi~m{0T9PS!z| zA=h2zmA4BG5ElvW)&ZjCUhDi|HrnR=fk2q`8@dR}8O3ZxA4X!RdXPx&1zIYDbL{wjMWv)n?AUUZ-@K7%+HC*X>&K_en~Is!zorM8W2s6#=wYU5 z;)s7P64m;%&~V=bGdwf(;9}Nx=N|a|8tZFYvUck=qptspH%CKiN@az5wwTJIKc8m;uYgFZxm#aM ziqk@Pqq%EjLiG#Gri}$Y?e9KU4Bk6N9G)!u@?UACS|mTDxkEUCp3rKM)(18IP}b&X?you z<+|G)S9ef)$!Fb#(J~|8Vqih`Exy7zY>dcRl9u@kjQnfd;VviqkUw1qygcvF;8L|eB(k)bK4d-6>Kt~B)j5ivp7^T!>1z#y|aCxM~)4iY!_+PNz<9jd^f3~HSY+$IKaBlZ}{PwvE@Y~ z5nxCq0aXFgK};A&Xh8A6dQvxzq$0Qh9rV?3Ql3}c%zfn-^_wZQzoE-{&^*o-Ql=l= zsTqQU0DhJU#e!S`plF%Ka()DHo$Gu#C|$aURnn_FU_|@xUT(bC;YLnwXoyv=X~%;~ z!>ZUjA~SU_7!)f+RvY-muk4<31*uDR$^oB_vb)@P_hBoN;e3)7!>Fy|a&O zIjqH``~CUXJSA2#2eG^4R0Yc_P?%M-L_X+(qCRy6Odq1`H#-BGde}cOul+Qs{;mnZ z#a;%vBH3e++!u}pm8rs1eUDk9a8C(}qg=T4j_gvY7JIR|oUAT?Qv zT2*WqWf)jLTOPaDAD3`?Zph@6aJUGEy?@%idElZczenW_^*b3cd29>p)s7c5mw1Dy zCwr?7C~0szx{9D zaLZ??MsP=I4pAMIC&c#Iq!BcvedPmkSZk^L7i7u^0czncU0tVn^epL)>dzZ7%KW>2$T|)N4&NLiNmGVz)2P4cKYJ^jMdm+r>qkH(v z7}fx3GfD4KrvmunLqCCnyLZKX4dXXaWh>9nI2qKk{!zfAlXK$4= zy4s0Fe1v}`2qryfPzyiwV7}a$sFAP(tg`be+0u7%*BnM491Z_;${T#WqUpxAzy$|2P=1DS&ahrNWp~Brm!vGQlf7i94>E zLkgDi7;)z(1#41a>OtZIYb^jPJ2c``H^t*^q2ikW91ssP>QU(LcNFD|z8E#_zq*H) z^lPt}D*J0O%_2wT61+*DDx`#3EQ{~_P(`S$xq_;v4{ifKNAB zL9x_8zK_Z?`gQ3&gO>8JbmpS^Tcgr##CFOW)qJkI=6o)6_;gQ(5MR2OPo|%)<0Alm z5ai2vRX9!_ezJKXM$BZv#3EE~a74J(HVvF)t+N4J;f`j5XC82AuVCqJR^?bH7mnn? z*&o^`0JkP|Grr0bHBhb8P-_Q;s3E$83Z$ta)IlvVneS?IId|&>3_u#x#htVv?mTR3 z7Umknz&NXqSDrxQY-OIJL=IB}3@Gp+5OQ{f{tzm^H&RvJq;0udaDt?#vPXPqCSfWw zqiG~GXr)PswT&6?E}hY0UWuRJN^SxGQ3U{oZ#E5PS}7mMqjPWoqNdY8l)pe~n7~NU zoUZj+Ol8t zI8w5)7jz@M#|omwyVoO<-BegtTvP4Af;KjL2(ea#rabjn0h#@{jYi}9Z?HF6JLlX4GNVUWvxF7{L{6x7;5K|lhv=c z71*%#cXz^q;_+3H${pFTT%Zx(S4Q=6RR2IU4ky+^Po69#{$a=)Yuu_O2s6H#wy7*v zno}DIg8_8uAqWgAqXxr33{YSnn56DymMbDtg3eKY+)L&})t@R)1S0Mp10kZh{0_A| zbToHH{8_$gAwoo<{ThnOl|#78`oL8uSHAA)Aaz&%z=!2#nD!%#p#XR7{?Su$7Ha2w z=#OS{{pHSg3FT5;7C~%A>zR~AY7!naY+k)r!zqp4!M!Tl?!99|u6qppv=NbW9TyKE zD#t->Jp}8Mr7mEVuu6zcDprfBn%n$z=daA7H$=iFNm*`yiTihB;D31mG;)d3F>X#W zj@X{=3xIJ0WaJ-mrH*i0OT!9N5#a`~0^8SQ!Ecj)^km3dOz_um%kNx=@u)@-sR*U? zcdlR+<7MS=Z%srn8HQRBpRn!vdg#)jQ!7bUtyfQgHVtr_6|R7mKdt)<(DH{3WKljW z^ao9Tr(V|R+g_c_I0z(w+Ja5>aj)+i#1n~!UNj(Hiof0W2@n59%L;QjG<4sEFF(giwu$-bF>tH_k3a#= zv=6WnDNEjpmDB=-&>ky^;pORpJQ zFES+2`vHT05lJS-(+s||)s2j3?!Jkka;S{_Z`v&|>4%K3-_+_zFZxW%J zP+njX+7}I|rbQd7>D`8EG63rZo~=DL4ebf^d$GLU)Du4X*xpL^M~XeJ9Dz!RV()qJ zBgK9nI7>i>9F-gJ{|y}?pnC$wXlRjoOdMj2P*1!Zc4dtMX5%WD2)Y{3$k-BKbb=6S z(Ta7oq^T#qqlfo(gp7dU-Hit)XZ8sEwTfv)yaZsxEnvIe2Y0ol6E0sPhm(rbTodHy zu%5)`IhJgL&T^pU0B=AbT+e{Bx>HS8JRKjx&!V2C^;DyJ@m`UJ8KYz@7_o(Wxz+%X zC^@s??hVU)JPg>IRUCK<$sjVRIXb@30PBWP2iKoHhz*8cL%L?!y*Ez@y?_OpqJmf9 znN9TF2n8=T!UQN|XI;Tl!;AE6-=9_Naexm@_1#9ROJG;#Q?Y>TkA-nxIu$(;sQq~? zGp?(y(M0#Egsg%)1ngQHjHtN`_o}>UnzQ%GHJXKR^lxJ%v$F*7hp4-@Fv_bO)w7sI zr~|om(DXw(!`G!;w7tf6eBoroI?rUG=}Yn)D()|8S5#K^E~N@o2B7CaZJ_|2{0`6- zGG65d_?@%~(*HhSOc_TpV)@NyiDrK-)@0$R9+{_h;ZviX(Hiw+$&M2bQ#CO_5aLP1 z86r=}H$6s5PP1E5%Sg_ofbOP4|23evKywp#TR_fa`=CrsAnu{M;wTlBiF8xAP{C1Z z8n|$MYhWhzOt)rk@?E9@!N)u`G`Ar~lonN-P=u>NjYdb!AYu)@fv4gvSKmVGB+3|- z?jknG2S5=~2^oRKeCy9aG7SRBUM*K;KGtE1M*-MCJt>;CLwLsOHF9SFHqfjMz=oxY zshhQr)-ps(@1a@y0RQ#2!^PuQf^5Q_o{;{O+20j)ri@`oGGm0<4pccR79G;?{Snny zKGom3{;#tK&C85I4{@XLrBNcLhE3gR8Vua;l*c0Ys5U-bdm#umj}epxlVU9v{_P_l z|MJMsg8nvwKp0WUwe@jTIABCDJv4&QiSOfIvy;g>L7nw1iyVjF4zC04K|?%{25&Ss ziOS@>Jwz2WmHQ@9Jp^#jJ@k}{HmF=nfL0Cn8mHllCZ&7xW7g}xk5hEh>}5_=_tIQ( zF$U^3&>D$P&|LGYMnG$k0OzsuNIscyV7y28>xvF=K9spCevzd~L-Bo8&(&-FD@(W| zIUO$SPkOmCM121x!@k<#wFzD-xR5b*Ow{_K5X({1Jy+kqy&yU~((ibc_uY)4|W%9%UnZ<5W}L-kb##JvmX^XTGX#o^eZac`WXAKf^* zEd~qTJB0BQ%NW+xu}lW>*s}ESO#C6&0PZqd$pysb&Wj=_ zcb8@pVwN8a%Es>*!7ROu;T5O!m+|l3VxCOv>9tYl>nU{@dpEhxdTW=5=R25m!JcL; z-@NVDO1E{d3h+%w^VfuOmcJQi7|E?l^-bN7$_j0ObI zhFL@`UfDC;iC@W#X{@>DuC$BHGwm7}@8#ZUgM#Sc;_{E(^%uiAS2tPxt~g@#X8u*` z-NdNK6BG15B;T8!#^|+u?RCz`#p|1f1ZIZ~c~f9;L?9fPae2DX?Fw-)J+jM$kkW?! z_s+U{PQ|ltY&E$46F%SP>}kj2WTMZX(SL578PC4QN-FwZf@T>_(BNZ&r$p@!G` zlQ0mlp8&wTP{#|D%=8%Ocz?Qcl5M}+&7UP(uneA@KX*2bO9S@)oZRRLBfZ**MVC!o ztwlFd2orgNA!Kow^2?tZz1L2W_?*&B`1s;qpY6| zDxB>?DZl5&6`Yby8Ok$_E;mklHdn9xY2RVtFsE>n=@!pLd5b*KwbqTKER{ zsqxUn5*5FbvPVGTImsDFO=CwClN%6Qs)oiBO^i!m81n+zN~Ci@`Gm3vr{DCNm&gkg zULXt|ceuNH8ah(XEp1mTL3`7#R%(W7_K+MrnAM3~Q{RDZH76pxISmwps{Rx#U=jeS zz%!pTgUk5P=}_xWw@OZ$m)t*NS_^{SR++A@6Two|@3`|cx1pqNkc~hXr?SF_X^q4% zOF)DRYM8C(+d-lxKlLX!W)7xa@jGN1D&Kj4(lKMpb_5W5mR=!~9BTj}JhGsT9WTlrY{lAx=kxd|B@3t$v9L0ggDFJ5eF9kGCI zWz&7Vem;pHcY7#5_JOUCdt$~6G;jmtjs%}14Y|W@^UFWU9`KtnZ!#j2He~0ihkcX? z?n(nK&j{`ufG9!BBeu_VhYsXUUzsR}1!A5TnIfMc1t(=`fsbk3=Cw!JL@v^i4J)6Mj z*FT-QIbrn-l?MRhLL=@5*&rP-US_LXG(l$N=TEK26Rsa<^0E!iudKha2fKmRxPEOR~Ran%+a#d4*$ zY8+!f^l3DKi9jUSO^t*oIyNVHND&o(Te_0kzK|!fvqLX-p6dIs#FHE0Qx7FU;sp zhdvqm$ogTk-QGa{80kU0vbXdvu_N|k4s7{EH56W*Uvu>dQ$^`9~|R)UVCzM-kQdKPwRHvIIzs<{QmesZjNib(lD(#)@N<-QJaz2 z$b}X)niWG*L{kK1GtNI@UhjYNov`ELWiQ>vSoVqd<7q+7?Bo9G>u-l0d$42b%JeY( zVV%V(S8}ea|0ZXLTwsKDr}I zf7pyH+n9U2C)AHcJWJ{!X~tbxd7@tO=+{|K&z&x;e-ObMqRw(kn!47->{*|>F;`dT zEl-SSoRc1+c=GelkMu+4|CD1CQL(3sWa@Ux#wv|ud=NIL?x=2R$$umAh_&Rbx>(BS z1x?pi`+?EZWrl*^wjUVmTVL%5yXfWwdfs^_kIT9RoH<(@d_~EbuM^#_GB{S9k3_fK z#HM|0d$W5_=y91X23*7+}Xy7T>L#-TK zkN`MQ*ug+}Tx6)bZ{({FvzBq2l~-kx6z7$El{2v!ios1Nt^-76E8NQ(SJ5pu8(Ir{ zXt~|f!|Q6s_pas*;m!wXEuJIeVZoX7DJpr83%CI-^h?_^B+F>vbprh3g~&28RbQ1FwIQ(``S27rYB z7}!@> z3jV%i!-|D)-oYvi*`$02Kp9O@0Oz1dpcx9sQ#DHqfT4&?v-PdNwJpttJ)p_s`)EJ) zySWC>S!s^Ygl>i=)DHmnDI{RjoHmS_PyI19nNy-^Ous(i17ILjH|PS4iewHs_$Ts4 zpgab9k7jRf9sQiWVPNwnGoHl4)Z#?-nMDJvfD^z^Ptv3!(nk~h5nfFL(9DY`%at^S zGwwx}#VY#Xi92O;T;Qj>hRGevh&L7>snPHy(13r03-aF8BT@?XP$xhr>RV|k=nRo2 zwMl|#>R1J$rIKvUM@)c`c&nb^APG=@$w>Lf6+->@6_TU}VpHhcXM0qh-i5?w;7thd zmznCICwMwO2n0D$Q>ANr*S2qaX`-Zk+xxGZG!Y#ApM#MYt(0}Dp)7TZ*V{S<;3|z{!jRgnZH*c!jJ9K)8ligx) z;%qVAGkN7mzrA~W-Y}Gd1kxXXbqZImlAFy_hE_Q$r~AHtH0_1q4CcMfKGo-jtn0mJ zjDelW9JdXDMfYAgWhi5-yo~Kv+)Ul`LfqZ!N^sBdF9xS==@B;YkJG1w7XkxoN2D%z zni})r$JxUdKe_larcQX)BWL1#_hE1D^g6oUd(V{q_2o939v<9wvLfB)!<#EU6I1^R zKEI;Y^T^IcJATV(WOgl$?`p3f{q&3=c7)4Lx!KG;rL!U}mi1=89I*cE{+n~pUl#e^ z=r>V|EtO;%2R1I1QXS5=-ek-BN@?c)NSe-lh$Y-7EIDTz<)b%I3`^Oj^ z+ak%cIW4?{cjtOuez`Po{i6%S9k;l}u8P;UL)fZKZ*5jr?u!bxnQ0ev=G5zkpEqZ7 zn93$u@^Tg&nnOZfxOq>_JlN?*h~c&Yt~MLb<*$isig0%P!+O)f(Leo^V)m44CyNd9 z-%w|8px=v>povxaucrH+eHLz3-aWndvJs#g-I3kBXUvQ)^KJITJ3RUG5V7Q_S#kc* zNi$3FV{aB**tIcj;^z0Y+n0VwStpz!e{pQ%3uErzQxg{NNnbOg_cXgrTh@dXbH(u- zgYnC6^Fwj*D;R(ojTBpX04?1Ycm=dk=S>iG8-klA;e~8D)8V>#QSRO0IVOuYu%U?|uE0iHiAS(yZNG)Iz zmHkwx0N%q}1WB1Mcc$~?g)ikNO^1EK2TAcT(KS{Ud6+r=8Mw7@{Zs6_$A3G7Jbz8H zou`-0KnF-6!elEFd-|;09Bz+`n+9nh|1}- z6duv<=!DWeA{~`8n}jEXNb~~qgxb~i-JoS_?_ym6;Kcu|xPhVMoN5~nM&VNZY#iw= zX|RVr91z$;9}dG$@Pst03Sy0RpB9x%Xd&Z9MJktg_Z_9t*EEK|oVLeWdVK(-tLIW=A!GHu`P{JfHN;w}mhLPVNSy zP6U92=!vG$y~$S)^yjcjZKfp;7#Q9dr6p23xtNRvu_ORP93oZHuhHe^iuO%-zrC!D zME-ib7U1yzK*zrFL>{rei61>;!&u6nwHR#@D^RgZ0a`~cvHK?q0BUp8c>9*5A1<40 z@YemiT+7u=12{&(dFKeuyBg5O0xWW0#oILEDwjX$;TKvUd+7|+d+5mB|E2fX4FG`& z3sf1vgc#aW6-0@s1VBNvH_gcWFuhg$>Y>JC!Dr=^695%VQ zBJJU*?AlSR4pa_#y;F@OM&7HXp)PkhC;Rwohs{^tj+C1A|Eqq)`lc<*oyq*^Mty?^ z{1E%WDZ3BsxKi(#&ue6k5q76bRxeCX^%>IfdjGXs5>$6PGNR-KL9a|kE%V=yHg?2{ zHP4UV6oqbIHn2~U->+9k>@<2cBK<{A<4JQP3LjiKlpi(uNg`+DVEgSyGF|I-W0=8@ z+ZHi<1RfRU5N4@?16K_%JQp{^htoUkqOD)xz{%c|m&b&!THHT*bAfj^ztX@^56vlN z??BsXa;cZeKaV@sUBcF@mO=K>5?TBkX%v8_Kk zL>s#V@n7`IoIUe&ANM5<>JvZmXDX#@1;vKx3?rYSk)zh$_nH^dF=SC^?&Xf%7XTE| zue;Cv%wd63?uvTh-dgN{t;u69zLh)A@4VMrS@AM=4&&6w;yH|m#Rja5oDWuwupc)v zFy5fR%(AI6QC{cF7o4I^6aDvR_^xSqeCm4GO71H2liT$sLmWj*QT8t8u|GE~y5$%u zHO`Fj4RCoFyrOE(g<@=i-I|joSr}&V&)}K!Jz}R=%{(4DY$89D4~DnWE$@|VXqi`O zpa_5!S_R^(6gw z>>$Xa0cxuy3bM_oSo}$HF>#J}g=sP3TCRfz2T$Rsy-1}Slb%UNxnB>8Zk<|jsF~?7 zwFYpSx1}b2t<~pVj#LI2Xy%EOi$qN})MM&z5WI05fTULanjxwzYvdxqn~`ps1kzUD zi>af%XHyT_gm+$|kCOoggJF_LauYfhN2RoqAI`UOft%7LAcrsx0zc4FRnS!=VfPt+ z1;3ekbP0cZQ4jn3q1H)T&P3Jn({S~sKLYJ3s{(3-Jt(DoDd-CSU=>qE3L=@vYl?ou zQ4P#%0V0uG{PJc4*(wV(wwF18ERaC5zzMnuk)A9C_785+xf24aH+R?XO^p6!hAAm6SMfXBBFEDsn7_SsVo zt;QctoAHPL$@r58<^!aO0LxSG3M*vTYEs|g>OFk+QzU~FmsHizV*1-+-gY{(g(^*VTRU(c-i z5)Rma%QXOebgO~JGm_Z66X!hAJTE#`O$T|vG~H^x_CET39Xr=UWvIn+ue%>6D$fyB z<#6vdC>RnO;_g!^e~pSZ2MB?R{0qzh_|=_XzbcepYR{4~stPhHyVG_fZDHcc)- zIO~@R+@aqI(#bs~(1}_Pge6c$^>L;*FKZPAr-g3wMy6=7yhwWYk}Z#5_uhC}(m>c>GEN6UnMHC3| zU+wZI)n;*2cS6a&k+<75JoBahBaz%m#VTRa3LQkyZRFQ&F4STt#xL7JrU}sIN8Sms zptI5`&w%z$(9uFH*eL-D6fM;4V;YD|1d5E5#2R98Qgxgsl|s)&~D>Hor>rCA6bJa;f;aJ#lz@W7AZ2o^k@jSWQvErc@i za_hPA_bc|YFkpC)DdsQ^-7KA&)fc*1G_s;-9Js|IWXN*4Hq^+@cju~;E4NNQW8zL3 zp2$-V!BvNmCo8C}mYTI%(xQLslrge9C&)+y28nixMwx^uu#&4m4Mci^ACa~MMp3UL>2>dv1gIR zfd5fF>-yGRVnGu$eegB)`hf+xOZf_6*jPL*=r7=BKw(4M_ zmMn>^GtivUz#n>S4pdl zXXNCua!_iI@utlG=xd-5QN?o+^qN#d3&~N>{V`?$#R%zQ2A*B}EM|bW5XrI<;7;&C zmL(IT7Ha?qxzJb=tF~jHo3RA2$At>;Ejw^t^)5f{x3^X#n-$qS3J+m5nE_aLq5NAS za+T_D&nyOVO{}LL!Ha|69KATwe652Q=fjI5$=BjI^x`1mYFqeC)aV;O8YAU*u_MHk zM1t~rv>eXRHWD5RZYvA#(Y733A6c(26F_$f*q2d>yeJ3n0e%ZEi8AiW^}Kt6o55DC#pr(46kv`w$0^bHt8t-3>t>VPPh_( zjyDgw?Ew^Xsw_vbnJNQ-WE;q4T#4%$C^90h9C?X#Spi^timnq+x>?v6!!6LkmqR%T zs@CDP(D*_;jRsDdJ?FNmy0vO2Pf8sUzHcz#4OM@aDs4CO8EW7@rRu~}&sg9vQLZDA z>i`a#Zs`=tOF|y50;;F!N7t7Msn*l#ZKOi0tOio~!?6d-Qg=cExjPUx^JN+arqPH? zGZ%vKWffnE2xFoOj$T@|oJKr!kc!spM9Uc;Ma%g>e*d4&dQ{E6uY@))QOzU3_65bB zPF6z3uj#Nbcm<$W5-MFk)_W;{n{DKHKJf+daP?oOCwT()0Ha_j1E7aokt_sC(pU%@ z+aHuJ#o-=koDZ!N4WL!qLv(d|9L>n`Th9jglx8@6HXuH>{n?;W$(%tHxe7#)tt}HM z$Q!`u%BQ6TNX~*(k!^Ao8d2_$IVSKOLX*mg(51Q^jRC^^Q%XczG6dc- zBot;bT6;I|YcfS{nUa|kC^Rjs6H0!PTf?XTl*{IwI;$z&Q_)sak4Sht&r{cGz9nWwgZl~h68DVXq4UezE_ zJLAavGOB>;&R6QZF9n(e4efn_6D2P#iZ;KnTJDvR0h4y{V+dakFrMJ&>K+YkL7IAy z{atc102ZFbyhngG!ZEfXpsrDqn3frcX`X&p%ly!Sr^VXh?0|%Er==gtt02n(;08H| z5$W0Heo1I^zaY-Do%^Mueto_2hsd_zFulBE z0J_{}Z)~r>8KQv%Aii?79O8dkgTIhP?i;~hec2KVSvpW%osj-UKhQaMDH|n$2%*0# zkoG|O8w51APt17){NlgEi(2AnkLx!SE+_u8!X+N&=XoUL5f1VefWZ**Gbh_7KnH#f z6ty#8TSbO4(aZwc{rkw~|D4X}^=wgsO|~tcSI(mEe>)&Co~Q_6Q?u3)wXkW@KESHA zum)+rE(V}v!(_%SKq^5XU6BSzCFC!7P5W8AO%Fc9$g>BFo+2MUx*UFVOc4d_rZ(TM`n26%jZ&%%lF{!>R+&AKL( zKvgyZN)t9myI9QqAiw??i<$DPH-{?&Q9e9L*UvMh-$D6Eaqu z$7c4~*tq65+N{?NCPw=r9rC&empQ6t_A7=g`mXYU?5B6RfY2^w#jJ<d|ma^QluK-swWLroiiL#LZprLcGA8iT(mQ37ZZDqLZ*e zInfqw0n^pjVKC3tBS59xiE9a}C*b&%Hvgdf8&T3Llt2U9ILZZ3%So*%N7K4=&Kv?= z_!}-MJD-?~UzY=gXwkAzKC6l!!ZZvtLoHe=E+KTJKTn9fvgrC}wndI-4Y~=487NB` zrLHt$20r;8AY=*DQ%}o+vl!8SO<_vMT6r$Vr)K<9j~`bN!q4dV>Q;?T@_PE5_3X9NO!R)VphDAg^~D zBDkl^d0-wa1NmZCBoFSabe>I>$OpxNJa|da*})+2re1yKIx^R51nt3hM#bYGTIPRe z5Iitr$j$p}6-V-dIhcQdvO<8B536KdmL~JX$7nUQyjr8xn0sJ&+r{msbOaq10H-?L zGGyvQDk};5yZ;Q2nuDDo6v)&FtiRo-Vmut`^XF;Nd!ektUha~uJQjsA^nqlFN`N)@ zy)d_CsInSDNJeT-;E8ypH+bm~x`DUpIjWn<_E6hy(;DyZiTZucM56#L2SVN^^%hzV zM0=ZtAvw@|TBs2#S(nIX`TZ_1QGPG@BT&s&U=Z@YB#9!k#{3|Y9PQFrAVTD z^}4gSPBazGo7!!22&{vbY~Rj{cTdKLQb^cirp4CP!@1^3pUc0hd>(+dht4|IX?s2) zV>Wh1Oj*j~w1felS4=6K(!(pn?}7HgzR;`v1bZA{vVAMnv+tv}H5Ns{wjezId-B(T zZiQs9u}MhYY>Z4-^^}=Abbx?PJ@oiU{uO>k{$V^H^?c<8&?7J>JyX-s^9aBNk(sDJ z+ERAN!r3kSkdLRDWAotGeB0kqGyzXf7pC4Ws69qC5Bf7>y5&cP_m3?< zQdWP{@cvcH2sFhPU$lWCkNIcOMvuSv=c4~R@BW!yO9IrEX*CLSq{4@90hv(hnGf;q zjvwRQm4d2B>0A1%1pI+D7v|}suM$A4xvD??RRZn5nqg~K3k9U^3sK8ec6yrz&^$hX z;3On4Q|%I%HJ4BuYFgTwnX)<31WxGxZ2$jGUi=#cbT<<&GZbp|r>GYQlZve1fE^h{ zKa59!9ctns-DI@Np6(^#G=9$clqAK7ClFN;2`PH;UkqKTUN{`Epn;)-96F&d<_MyL z9NI-VA>90nei%6>{(GqEsc(gkVj4rrNcZ|M+de4DAXW3HKQcNlpX%dW=X>F(Ww|l-glq8E#LVy5$p9uH>AK? z0g^e>12TU<3pF}H4dj12)My4^OprsEY0rB?$WjdMa-j8t47T=Pf&#f_gFYs-2>s<&z`^B|y>1sP<*Z&{0MY^dYWy`)B|isQC&R7-f6*ftK%trMGRFmKbXPFS@L?1Dk@gXxu?nbD zxuPU-h6D6Y?PRYDWd?bUrO{Oc1RsXMu0>$j{}H=J#emxD8f3d5qB9u20YoSIkJY7Q z&_pLXL_Ts14KvP|#3|s@?Ezo`va=A0hpaOwJ1b6yE1>MGwa7UGU)pn(4D{ZyGuITH zGh0F0944mD!C1;V4j+y;BoKY0&3m0C8hxV;;&<*NgEOLc+RuO&7}rSkrdX8k0*vtu zz6_>ul>tNU@G1I~4qXA}p*8xnpRK2A1k!